3

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

  • 我正在使用带有 InnoDB 引擎的 MySQL。
  • 我已经config.use_transactional_fixtures = true在 spec_helper.rb中设置了
  • 我使用命令手动加载我的测试装置rake spec:db:fixtures:load
  • rspec 测试是为 BackgrounDRb 工作人员编写的,它正在测试记录是否可以更新其状态(通过 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

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

4

2 回答 2

1

我怀疑,像内森一样,交易问题。尝试在第一次保存调用之前放置一个 Listing.connection.execute("COMMIT") 以中断事务并查看发生了什么变化。这将使您脱离事务,因此任何额外的回滚调用都将无效。

此外,通过运行“COMMIT”命令,您可以使用调试器暂停测试并从另一个客户端检查数据库以查看发生了什么。

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

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

于 2010-03-30T17:42:34.163 回答
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,您应该会看到它;)

于 2014-05-30T11:23:12.170 回答