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/
62 lines
1.8 KiB
Ruby
62 lines
1.8 KiB
Ruby
require "rails_helper"
|
|
|
|
# Specs in this file have access to a helper object that includes
|
|
# the CommentsHelper. For example:
|
|
#
|
|
# describe CommentsHelper do
|
|
# describe "string concat" do
|
|
# it "concats two strings with spaces" do
|
|
# expect(helper.concat_strings("this","that")).to eq("this that")
|
|
# end
|
|
# end
|
|
# end
|
|
RSpec.describe CommentsHelper do
|
|
describe "#user_level_class" do
|
|
def comment_double(**attributes)
|
|
defaults = { as_administrator?: false, as_moderator?: false, user: double(official?: false) }
|
|
|
|
double(defaults.merge(attributes))
|
|
end
|
|
|
|
it "returns is-admin for comment done as administrator" do
|
|
comment = comment_double(as_administrator?: true)
|
|
|
|
expect(helper.user_level_class(comment)).to eq("is-admin")
|
|
end
|
|
|
|
it "returns is-moderator for comment done as moderator" do
|
|
comment = comment_double(as_moderator?: true)
|
|
|
|
expect(helper.user_level_class(comment)).to eq("is-moderator")
|
|
end
|
|
|
|
it "returns level followed by official level if user is official" do
|
|
comment = comment_double(user: double(official?: true, official_level: "Y"))
|
|
|
|
expect(helper.user_level_class(comment)).to eq("level-Y")
|
|
end
|
|
|
|
it "returns an empty class otherwise" do
|
|
comment = comment_double
|
|
|
|
expect(helper.user_level_class(comment)).to eq("")
|
|
end
|
|
end
|
|
|
|
describe "#comment_author_class" do
|
|
it "returns is-author if author is the commenting user" do
|
|
author_id = 42
|
|
comment = double(user_id: author_id)
|
|
|
|
expect(helper.comment_author_class(comment, author_id)).to eq("is-author")
|
|
end
|
|
|
|
it "returns an empty string if commenter is not the author" do
|
|
author_id = 42
|
|
comment = double(user_id: author_id - 1)
|
|
|
|
expect(helper.comment_author_class(comment, author_id)).to eq("")
|
|
end
|
|
end
|
|
end
|