所以在我为我的RoR模型演变的rspecs中,我最终得到了两个完全相同的测试:
it 'is valid when x is zero' do foo = build(:foo,x: 0,y: 10) expect(foo.valid?).to be_truthy end it 'is valid when y is ten' do foo = build(:foo,y: 10) expect(foo.valid?).to be_truthy end
这是因为我首先编写了验证x的规范,然后添加了y之后的规范.
显然,是时候重构了.我可以删除其中一个规格,因为它们是重复的:保持干燥.
现在,每个规范的内部可能完全相同,但它的描述是不同的.我不想丢失那里的信息.
我的问题是 – 在这种情况下是否可以保持重复的规范完整,或者我应该合并它们并重新描述它?也许:
it 'is valid when x is zero and y is ten' do foo = build(:foo,y: 10) expect(foo.valid?).to be_truthy end
但在我看来,我现在有一个规范正在测试两件事(Foo模型中的两个验证子句).这也不好.有一种潜伏的气味.
我错过了另一种方法吗?
解决方法
我不太担心DRY,更多的是关于编写实际涵盖你想要的行为的规范.
it 'is valid when x is zero' do foo = build(:foo,x: 0) expect(foo.valid?).to be_truthy end
这个例子实际上并不包括你的验证!如果您在模型中注释掉验证,它仍然会通过.
测试模型验证时的一些提示:
>避免使用工厂.只需使用.new和正在测试的属性进行初始化.
>测试无效和有效输入.
>描述验证的行为 – 不是可接受的值.
>单独测试每个验证 – 您的集成和功能规范通常会涵盖整个验证.
RSpec.describe Foo do describe "validations" do describe 'x' do it "validates that x is a number between 1 and 10" do expect(Foo.new(500).valid?.errors[:x]).to include "must be less than or equal to 10". expect(Foo.new(10).valid?.errors).to_not have_key :x end end describe 'y' do it "validates that y is a number that is less than 15" do expect(Foo.new(500).valid?.errors[:y]).to include "must be less than 15". expect(Foo.new(10).valid?.errors).to_not have_key :y end end end end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。