我还没有完全理解rspec编写测试的方式,但是如果有人能帮助我理解我在这个测试中做错了什么,我将非常感激。
describe Source do
describe "Upcase name" do
names = {'bob' => 'Bob',
'edward jones' => 'Edward Jones'
'Edward jones' => 'Edward Jones'}
names.each do |name,expect|
before { @source = Source.create(name: name) }
after { @source.destroy! }
it "source #{name} should be #{expect}" do
subject { @source }
@source.name.should == expect
let!(:find) do
Source.find_by_proper_name(expect)
end
it "should find" do
should == find
end
end
end
end
end
我对源模型的name列有一个唯一的约束。
由于唯一的冲突,测试的每次迭代都以失败的形式返回。(尽管我认为每次迭代只会创建一个模型。
如果我把三个名字的中间去掉,这样所有的名字都是唯一的,如果它一次创建所有的名字,那么测试就会失败,因为@source等于所有测试中的最后一个值。
本质上我想要一个DRY的方式来编写测试
Source.create(name: "bob").name.should == "Bob"
Source.create(name: "edward jones").name.should == "Edward Jones"
Source.create(name: "Edward jones").name.should == "Edward Jones"
我该怎么做呢?
你把很多东西混在一起了…
重要的事情先做:
- 不嵌套
it
- 在
it
中不使用let
,它们属于context
在 - 不要自己清理数据库,使用数据库清洁器或事务固定装置或类似的东西
it
中迭代it
看看我是怎么做这些规范的,也许这对你有帮助:https://github.com/phoet/on_ruby/blob/master/spec/models/user_spec.rb#L15