Rails测试db不会保留记录更改

时间:2010-03-30 00:59:41

标签: ruby-on-rails database rspec persistent transactional

我一直试图解决问题几个星期了。我正在为我的Rails应用程序运行rspec测试,它们工作正常,除了一个我似乎无法理解的错误。

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

这是我的问题:

我有一个名为Listings的模型。 rspec测试在名为update_sold_items的文件中调用listing_worker.rb方法。 此方法为特定记录调用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"

我无法理解为什么它保存得非常好,但每当我拨打reloadListing.find等时,它都会恢复原始记录。

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

感谢您的帮助, 内森B

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

2 个答案:

答案 0 :(得分:1)

我怀疑,像nathan一样,交易问题。尝试在第一次保存调用之前放置一个Listing.connection.execute(“COMMIT”)来中断事务并查看更改。这将使您脱离交易,因此任何额外的回滚调用都将是无效的。

此外,通过运行“COMMIT”命令,您可以使用调试器暂停测试,并从另一个客户端检查数据库以查看正在进行的操作。

另一个假设是,如果事务实验没有产生任何结果,那么您的模型可能确实没有保存到数据库中。检查查询日志。 (具体查找更新查询)。

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

答案 1 :(得分:0)

如果您想在运行测试时调查数据库中的内容,您可能会觉得这很有用......

我有一个rspec测试,我保存@ user.save,它就像一个魅力,但后来我想知道它是否真的保存在数据库中。

我为测试环境打开了rails控制台

rails c test

User.all

并且如预期的那样什么都没有

我运行了包含以下内容的规范:

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

我认为保存后停止测试意味着它会持续存在,但事实并非如此。似乎连接上的COMMIT后来被解雇了(我不知道什么时候:\) 所以,正如@Tim Harper建议的那样,你必须在pry控制台中自行解决这个问题:

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

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