ruby-on-rails – 保持干燥,但想要重复出于不同的原因

所以在我为我的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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...