使用shoulda-matchers和RSpec的新expect syntax的正确格式是什么?
答案 0 :(得分:56)
虽然可以使用具有新期望语法的shoulda-matchers,如下所示:
it 'should validate presence of :email' do
expect(subject).to validate_presence_of :email
end
或更简洁但可读性更低:
it { expect(subject).to validate_presence_of :email }
这些匹配器通常使用的单行should
格式在2.14中明确支持,即使config.syntax == :expect
也是如此。 当should
与隐式主题一起使用时,如:
describe User
it { should validate_presence_of :email }
end
它不依赖于Kernel
should
的猴子修补,而shoulda
依赖于此。
https://github.com/rspec/rspec-expectations/blob/master/Should.md中介绍了这一点。实际上,该文档甚至使用上面的it
匹配器示例来说明此异常。
另请参阅Using implicit `subject` with `expect` in RSpec-2.11,其中讨论了一个配置选项,可让您将其用作expect_it { to validate_presence_of :email }
的替代方案。
it { is_expected.to validate_presence_of :email }
更新:从RSpec 3.0(beta2)开始,您还可以使用:
{{1}}
答案 1 :(得分:0)
我会补充@ peter-alfvin的答案。如果您使用shoulda-matchers
自行测试模型及其迁移,则无法在:expect
块之外使用it
,因此无法写入:
RSpec.describe ModelName, type: :model do
expect(subject).to belong_to(:user)
end
你将获得预期:
`expect` is not available on an example group (e.g. a `describe` or `context` block).
但正确的版本是:
RSpec.describe ModelName, type: :model do
it { expect(subject).to belong_to(:user) }
end