Rails测试数据库不会持续记录更改

问题描述:

我一直在试图解决问题几个星期了。我为我的Rails应用程序运行rspec测试,并且除了一个我似乎无法理解的错误外,它们工作正常。Rails测试数据库不会持续记录更改

  • 我正在使用MySQL和InnoDB引擎。
  • 我在spec_helper.rb中设置了config.use_transactional_fixtures = true
  • 我使用命令rake spec:db:fixtures:load手动加载我的测试夹具。
  • rspec测试正在为BackgrounDRb worker编写,它正在测试记录可以更新其状态(通过state_machine gem)。

这里是我的问题:

我有一个名为Listings模型。 rspec测试在名为listing_worker.rb的文件中调用update_sold_items方法。 此方法为特定记录调用listing.sell,该记录将列表记录的“状态”列设置为“已售出”。 到目前为止,这是所有工作的罚款,但是当update_sold_items方法完成,我的RSpec的测试失败在这里:

listing = Listing.find_by_listing_id(listing_id) 
listing.state.should == "sold" 

expected: "sold", 
    got: "current" (using ==) 

我一直在试图追查为什么状态变化不是持久的,但我非常丢失。下面是我在测试过程中放置​​在update_sold_items方法的一些调试代码的结果:

pp listing.state # => "current" 

listing.sell! 
listing.save! 

pp listing.state # => "sold" 

listing.reload 

pp listing.state # => "current" 

我不明白为什么它保存完美的罚款,但随后恢复到每当我打电话reload原始记录,或Listing.find等等。

感谢您阅读本文,如果我没有提供足够的信息,请提出任何问题。

感谢您的帮助, 弥敦道乙

附:我没有为其他类创建新记录并测试这些记录的问题。当我更新数据库中已有的记录时,它似乎只是一个问题。

+0

当你重新加载时,不要事务性的灯具会导致ROLLBACK?一切都在交易中,所以他们可以在每次测试之前重置。重新加载/ ROLLBACK将是原始状态,而不是保存状态,是吗?你为什么重新加载它? – wesgarrison 2010-03-30 01:18:42

+0

好点。我并不是100%确定交易是如何运作的。谢谢你的帮助! – ndbroadbent 2010-03-31 00:23:49

我怀疑像nathan一样的交易问题。尝试在第一次保存调用之前放置一个Listing.connection.execute(“COMMIT”)来中断事务并查看哪些更改。这会使你退出事务处理,所以任何额外的回滚调用都将不起作用。

此外,通过运行“COMMIT”命令,您可以使用调试器暂停测试并检查来自其他客户端的数据库以查看发生了什么。另一个假设,如果事务实验没有产生任何结果,那么可能是你的模型实际上并没有保存到数据库中。检查你的查询日志。 (具体找到更新查询)。

这类问题真的很臭!祝你好运!

+0

感谢您指点我正确的方向!我终于搞清楚了,我重写了模型的“更新”方法,感觉像个白痴。谢谢!! – ndbroadbent 2010-03-31 00:22:19

如果你想调查什么你在DB同时运行测试,你会发现这是很有帮助的......

我有一个RSpec的测试,让我救@user。保存,它的作用就像一个魅力,但我想看看它是否真的保存在数据库中。

我打开轨控制台测试环境

rails c test 

User.all 

与预期没有什么

我跑我的规格,包含:

user_attr_hash = FactoryGirl.attributes_for(:user) 
@user = User.new user_attr_hash 
@user.save 
binding.pry 

我Ť希望在保存之后停止测试意味着它会一直存在,但事实并非如此。看来,在连接上提交前被触发(我不知道什么时候:\) 所以,@Tim哈珀暗示,你不得不解雇犯下自己在撬控制台:现在

pry(#<RSpec::Core::ExampleGroup::Nested_1>)> User.connection.execute("COMMIT") 

,如果你在你的轨道控制台中运行User.all你应该看到它;)