Remove instance_double usage in CommentsHelper tests
Lately (not sure since when), from time to time we've been getting these
failures in our CI:
```
Failures:
1) CommentsHelper#comment_author_class returns is-author if author is the commenting user
Failure/Error: comment = instance_double(Comment, user_id: author_id)
the Comment class does not implement the instance method: user_id
# ./spec/helpers/comments_helper_spec.rb:48:in `block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:40:in `block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:39:in `block (2 levels) in <top (required)>'
2) CommentsHelper#comment_author_class returns an empty string if commenter is not the author
Failure/Error: comment = instance_double(Comment, user_id: author_id - 1)
the Comment class does not implement the instance method: user_id
# ./spec/helpers/comments_helper_spec.rb:55:in `block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:40:in `block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:39:in `block (2 levels) in <top (required)>'
```
It might be related to the upgrade of rspec-rails done in commit
6fe222148 or maybe due to a change in github actions that caused some
tests to fail, as described in commits bedcb5bca and 3e44eeaee.
What might be causing the issue is the usage of `instance_double`
stubbing different methods in different tests (not sure this is the
cause, though).
We've seen that somebody got a similar error [1] (although it might not
have been for the same reason) and one of the maintainers of rspec-mocks
replied:
> I would recommend switching to double (as you mentioned) or
> refactoring to use something more defined.
So we're simply using `double`, which is what we usually use when
stubbing objects in the tests. Doing so is faster than further
investigating why the `instance_double` isn't reliable 100% of the time.
[1] See issue 1587 in https://github.com/rspec/rspec-mocks/
This commit is contained in:
@@ -12,25 +12,26 @@ require "rails_helper"
|
|||||||
# end
|
# end
|
||||||
RSpec.describe CommentsHelper do
|
RSpec.describe CommentsHelper do
|
||||||
describe "#user_level_class" do
|
describe "#user_level_class" do
|
||||||
def comment_double(as_administrator: false, as_moderator: false, official: false)
|
def comment_double(**attributes)
|
||||||
user = instance_double(User, official?: official, official_level: "Y")
|
defaults = { as_administrator?: false, as_moderator?: false, user: double(official?: false) }
|
||||||
instance_double(Comment, as_administrator?: as_administrator, as_moderator?: as_moderator, user: user)
|
|
||||||
|
double(defaults.merge(attributes))
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns is-admin for comment done as administrator" do
|
it "returns is-admin for comment done as administrator" do
|
||||||
comment = comment_double(as_administrator: true)
|
comment = comment_double(as_administrator?: true)
|
||||||
|
|
||||||
expect(helper.user_level_class(comment)).to eq("is-admin")
|
expect(helper.user_level_class(comment)).to eq("is-admin")
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns is-moderator for comment done as moderator" do
|
it "returns is-moderator for comment done as moderator" do
|
||||||
comment = comment_double(as_moderator: true)
|
comment = comment_double(as_moderator?: true)
|
||||||
|
|
||||||
expect(helper.user_level_class(comment)).to eq("is-moderator")
|
expect(helper.user_level_class(comment)).to eq("is-moderator")
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns level followed by official level if user is official" do
|
it "returns level followed by official level if user is official" do
|
||||||
comment = comment_double(official: true)
|
comment = comment_double(user: double(official?: true, official_level: "Y"))
|
||||||
|
|
||||||
expect(helper.user_level_class(comment)).to eq("level-Y")
|
expect(helper.user_level_class(comment)).to eq("level-Y")
|
||||||
end
|
end
|
||||||
@@ -45,14 +46,14 @@ RSpec.describe CommentsHelper do
|
|||||||
describe "#comment_author_class" do
|
describe "#comment_author_class" do
|
||||||
it "returns is-author if author is the commenting user" do
|
it "returns is-author if author is the commenting user" do
|
||||||
author_id = 42
|
author_id = 42
|
||||||
comment = instance_double(Comment, user_id: author_id)
|
comment = double(user_id: author_id)
|
||||||
|
|
||||||
expect(helper.comment_author_class(comment, author_id)).to eq("is-author")
|
expect(helper.comment_author_class(comment, author_id)).to eq("is-author")
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns an empty string if commenter is not the author" do
|
it "returns an empty string if commenter is not the author" do
|
||||||
author_id = 42
|
author_id = 42
|
||||||
comment = instance_double(Comment, user_id: author_id - 1)
|
comment = double(user_id: author_id - 1)
|
||||||
|
|
||||||
expect(helper.comment_author_class(comment, author_id)).to eq("")
|
expect(helper.comment_author_class(comment, author_id)).to eq("")
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user