终极DRY模型rspec

时间:2014-01-02 21:49:18

标签: ruby-on-rails rspec factory-bot

我将我的模型rspecs重构为"作为DRY"尽可能导致像

这样的东西
require 'spec_helper'

describe Model do
  subject { build(:model) }

  it { should be_valid }

  it { should validate_presence_of(:description) }
  it { should ensure_length_of(:description).is_at_least(3).is_at_most(255) }

  it { should validate_presence_of(:position) }
  it { should validate_numericality_of(:position).is_greater_than_or_equal_to(1) }  
end

现在,每个文件都以

开头
  subject { build(:model) }

  it { should be_valid }

所以,你猜它,我想摆脱这两行...

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

it { should be_valid }测试似乎只测试你的工厂。它对模型的功能并不重要。如果您想测试它们,请考虑将这些测试移至单factories_spec测试。请参阅:https://github.com/thoughtbot/suspenders/blob/master/templates/factories_spec.rb

您在示例中使用的匹配器实际上并不需要使用FactoryGirl构建的模型。它们可以与隐式的默认主题(Model.new)一起使用。如果不是这种情况,我建议在测试中尽可能多地定义测试状态 - 也就是说,在it块内。如果这会导致一些重复,那就这样吧。特别昂贵的重复可以提取到方法调用,这比subjectletbefore更好,因为它们没有魔力。作为开发人员在6个月后回到该项目,查看第75行的规范,您将确切知道设置是什么。

请参阅:http://robots.thoughtbot.com/lets-not

答案 1 :(得分:2)

您可以使用rspec shared examples

shared_examples "a model" do
  subject { build described_class }
  it { should be_valid }
end

describe Foo do
  it_behaves_like "a model"
end

describe Bar do
  it_behaves_like "a model"
end