我在测试destroy
方法时遇到了一个奇怪的问题。我正在使用FactoryGirl和Rspec。
以下是有问题的方法。正如你所看到的,它实际上并没有破坏经销商,只是将它设置为依赖对象的active
属性false
:
dealers_controller.rb
def destroy
@dealer = Dealer.find(params[:id])
@dealer.active = false
@dealer.save!
@dealer.leads.each { |lead|
lead.active = false
lead.save!
}
@dealer.users.each { |user|
user.active = false
user.save!
}
redirect_to dealers_path
end
当我在应用程序中运行此方法时,它完全按照它应该执行的操作。现在,进行测试。
dealers_controller_spec.rb
describe "#destroy" do
context "when deleting a valid record" do
let(:dealer) { FactoryGirl.create(:dealer_with_stuff) }
before do
@user = FactoryGirl.build(:admin_user)
login_user
delete :destroy, :id => dealer.id
end
it { should assign_to(:dealer).with(dealer) }
it { should redirect_to(dealers_path) }
it { should set_the_flash }
it "is no longer active" do
dealer.active.should be_false
end
it "has no active users" do
dealer.users.each do |user|
user.active.should be_false
end
end
it "has no active leads" do
dealer.leads.each do |lead|
lead.active.should be_false
end
end
end
end
前3个测试通过,但最后3个测试都失败了(奇怪的是,如果我在user.active.should be_false
之后加sleep(10)
,delete :destroy
测试只会失败,但我们不会进入那个问题现在)。因此,当我检查测试日志时,它会经历整个销毁过程,但随后会执行ROLLBACK
,因此由于某种原因它不会保存任何记录;但它没有给我任何更多的信息。
有没有人对此有任何想法?我已经尝试过我能想到的一切。
答案 0 :(得分:2)
如果您重新加载dealer
怎么办?测试中的dealer
与控制器中的@dealer
对象不同(ActiveRecord不执行标识映射)。
before do
@user = FactoryGirl.build(:admin_user)
login_user
delete :destroy, :id => dealer.id
dealer.reload # << add this
end