27

使用shoulda-matchers和 RSpec 的新期望语法的正确格式是什么?

4

2 回答 2

59

当然可以使用带有新的 expect 语法的 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 }

2.14 明确支持这些匹配器通常使用的单行should格式,即使config.syntax == :expect. 何时should与隐式主题一起使用,如:

describe User
  it { should validate_presence_of :email }
end

它不依赖于其他依赖的猴子Kernel补丁should

这在https://github.com/rspec/rspec-expectations/blob/master/Should.md中有介绍。事实上,该文档甚至使用上述shoulda匹配器示例来说明此异常。

另请参阅在 RSpec-2.11 中将隐式 `subject` 与 `expect` 结合使用,其中讨论了一个配置选项,可让您用作it.

expect_it { to validate_presence_of :email }

更新:从 RSpec 3.0(beta2)开始,您还可以使用:

it { is_expected.to validate_presence_of :email }
于 2013-09-08T13:48:14.247 回答
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
于 2015-10-05T17:47:22.473 回答