【问题标题】:shoulda-matchers RSpec expect syntaxshoulda-matchers RSpec 期望语法
【发布时间】:2015-10-06 01:47:22
【问题描述】:

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

【问题讨论】:

  • 对不起,我的意思是应该
  • 关于基于主要基于意见的投票结束,我认为这个询问某事是否是“好主意”的特殊情况是一个例外,因为有一个基于事实的解释关注不是问题。
  • 编辑了问题细节以使其适合 SO。

标签: rspec shoulda


【解决方案1】:

当然可以将 shoulda-matchers 与新的 expect 语法一起使用,如下所示:

it 'should validate presence of :email' do
  expect(subject).to validate_presence_of :email
end

或更简洁但可读性较差:

it { expect(subject).to validate_presence_of :email }

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

describe User
  it { should validate_presence_of :email }
end

它不依赖于 Kernel 的猴子补丁,而 should 则依赖于它。

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

另请参阅Using implicit `subject` with `expect` in RSpec-2.11,其中讨论了一个配置选项,可让您用作it 的替代方案。

expect_it { to validate_presence_of :email }

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

it { is_expected.to validate_presence_of :email }

【讨论】:

  • 第一个块也会被desribe User包围,对吧?因为它看起来像是 3 行与 3 行不同的行的比较,但并非如此。如果是这样,可能需要在第一个代码块中添加以清楚起见。
  • @MichaelDurrant 是的,它会的。同意。感谢您指出了这一点。答案已更新。
  • 有人知道反对票是为了什么吗?这是否与“主要基于意见”的密切投票有关?
  • 太糟糕了,你需要 it 块。我一直喜欢 shoulda 匹配,因为它们语法简洁。
  • 实际上,您不需要需要该块。这就是我打算作为我的答案的本质。单行should 形式是完全可以接受的,并且被最新的约定完全接受/支持。但你确实给了我一个想法。如果 RSpec 引入 expect_it 作为 expect(subject) 的别名会怎样?
【解决方案2】:

我会补充@peter-alfvin 的答案。如果您使用 shoulda-matchers 自己测试模型及其迁移,则不能在 it 块之外使用 :expect,因此不能编写:

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

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 2016-03-13
    • 2014-04-05
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多