我的注册数据库有一个具有独特要求的电子邮件索引。这很好,但问题是我尝试运行集成测试,每次去rake rspec spec/features/...rb
,除非我先rake db:test:purge
,rake 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
答案 0 :(得分:0)
有两种方法可以解决这个问题:
从(:all)
块中删除before
。 RSpec将为每个测试执行before块。然后它会在每次测试后自行撤消。这确实是您想要的,因为它确保每个测试所做的更改不会渗透到其他测试中。这通常是推荐的方法。
保留(:all)
,然后添加(:after)
块以撤消更改。使用:all
参数,before块仅执行一次而不是每次执行。但是,它不会像:each
那样自动撤消,因此:after
块变得必要。但是,你需要弄清楚那里需要做些什么。例如,在您的示例中,它可能是:
after(:all) do
Signup.delete_all # Or whatever undoes what the before block did
end
答案 1 :(得分:0)
当您使用before(:all)
时,需要使用after(:all)
来清理您在before(:all)