这应该有一个简单的答案,但我很难找到它(已检查 RSpec 文档、使用 RSpec 进行的 EverydayRails 测试、Google 结果)。在我的模型规范中,我喜欢包含如下基本属性规范:
describe Foo do
describe "basic attributes" do
before { @foo = create(:foo) }
subject { @foo }
it { should be_valid }
it { should respond_to(:color) }
it { should respond_to(:height) }
it { should respond_to(:some_other_attribute) }
it { should respond_to(:you_get_the_idea) }
...
我喜欢这些规格,因为如果我的工厂和/或模型中有某种错误,这些规格可以帮助我快速查明它。
我已将expect
语法合并到所有其他规范中,我喜欢它的阅读方式,但是如何在这里使用它呢?一种选择可能是
expect(@foo).to respond_to(:color)
另一个可能是
expect(it).to respond_to(:color)
前者涉及should
语法避免的重复,但后者对我来说看起来很奇怪(可能只是我)。
我意识到这个问题更多的是关于风格而不是功能*,但我们 Ruby 开发人员对风格很认真,我想坚持标准实践并拥有可读的惯用代码。任何帮助表示赞赏。谢谢。
更新:顺便说一句,我提出的两个选项实际上都不起作用。他们都抛出undefined method 'expect'
错误。现在我真的很困惑!
考虑到错误后,我意识到这是因为should
上面的规格在一行内。那么,困惑是如何使用期望语法编写单行块?鉴于此更新,问题与功能非常相关,我很高兴听到其他人的想法。
2015 年 4 月更新
rspec > 3.0
已经添加了另一种处理这些的方法,听起来好像rspec ~> 4.0
会取消should
语法。根据迈伦大师赛:
一些用户对这应该如何与期望语法相关以及您是否可以继续使用它表示困惑。它将继续在 RSpec 3 中可用(同样,无论您的语法配置如何),但我们还添加了一个与期望语法更一致的替代 API:
describe Post do
it { is_expected.to allow_mass_assignment_of(:title) }
end
is_expected 非常简单地定义为 expect(subject) 并且还通过 is_expected.not_to 匹配器支持负期望。[...]
在 RSpec 3 中,我们保留了 should 语法,并且默认情况下它是可用的,但如果您在未明确启用的情况下使用它,则会收到弃用警告。这将为在 RSpec 4 中默认禁用(或可能提取到单独的 gem)铺平道路,同时最大限度地减少通过旧教程进入 RSpec 的新手的困惑。