ruby-on-rails – 保持干燥,但想要重复出于不同的原因
发布时间:2020-12-17 02:56:45 所属栏目:百科 来源:网络整理
导读:所以在我为我的RoR模型演变的rspecs中,我最终得到了两个完全相同的测试: it 'is valid when x is zero' do foo = build(:foo,x: 0,y: 10) expect(foo.valid?).to be_truthyendit 'is valid when y is ten' do foo = build(:foo,y: 10) expect(foo.valid?).t
所以在我为我的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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |