shoulda-matchers RSpec期望语法

时间:2013-09-08 03:35:15

标签: rspec shoulda

使用shoulda-matchers和RSpec的新expect syntax的正确格式是什么?

2 个答案:

答案 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