0

我还没有完全理解 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

我对源模型的名称列有唯一约束。

由于独特的违规行为,测试的每次迭代都会失败。(尽管我认为每次迭代只会创建一个模型。

如果我取出这三个名称的中间,那么如果它一次创建所有名称,那么所有名称都是唯一的 - 那么测试失败,因为@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"

我应该怎么做?

4

1 回答 1

1

你在那里混合了很多东西......

第一件事:

  • 不筑巢it
  • 不要使用let它们it属于context
  • 不要it迭代it
  • 不要自己清理数据库,使用数据库清理器或事务装置或类似的东西

看看我是如何做这些规范的,也许这会对你有所帮助:https ://github.com/phoet/on_ruby/blob/master/spec/models/user_spec.rb#L15

于 2013-01-19T13:55:43.130 回答