加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读