RSpec在测试中克服了独特的要求

时间:2014-07-21 02:35:42

标签: ruby-on-rails ruby-on-rails-4 rspec capybara rspec-rails

我的注册数据库有一个具有独特要求的电子邮件索引。这很好,但问题是我尝试运行集成测试,每次去rake rspec spec/features/...rb,除非我先rake db:test:purgerake db:test:prepare,否则会遇到独特的问题,并拒绝运行。我该如何简化这个?

从下面的代码中,您可以看到,每次我运行测试时,我都会使用before(:all)创建一组种子数据,但由于种子数据始终是同样,这也在推动唯一性错误。

我很高兴将此种子数据放在别处或以其他方式创建它,只要我的测试套件仍然能够使用此种子数据运行。

describe "how requests should flow" do

    before(:all) do 
        @signup_dd = Signup.create(email:"example@example.com")
    end

    it "should have 2 inventories and 2 signups to start" do
        Signup.count.should == 1
    end

    describe "request creation" do
        before do
            Signup.find_by_id(@signup_dd)
            visit '/requests/new'
            save_and_open_page
            fill_in '#borrow__1', :with => 1
            click_button
        end
        it "should affect new Requests and Borrows" do
            ...
        end
    end
end

2 个答案:

答案 0 :(得分:0)

有两种方法可以解决这个问题:

  1. (:all)块中删除before。 RSpec将为每个测试执行before块。然后它会在每次测试后自行撤消。这确实是您想要的,因为它确保每个测试所做的更改不会渗透到其他测试中。这通常是推荐的方法。

  2. 保留(:all),然后添加(:after)块以撤消更改。使用:all参数,before块仅执行一次而不是每次执行。但是,它不会像:each那样自动撤消,因此:after块变得必要。但是,你需要弄清楚那里需要做些什么。例如,在您的示例中,它可能是:

    after(:all) do
        Signup.delete_all # Or whatever undoes what the before block did
    end
    
  3. 请参阅this blog post regarding the use of the two techniques

答案 1 :(得分:0)

当您使用before(:all)时,需要使用after(:all)来清理您在before(:all)

中创建的数据