微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐