我一直试图解决问题几个星期了。我正在为我的Rails应用程序运行rspec测试,它们工作正常,除了一个我似乎无法理解的错误。
config.use_transactional_fixtures = true
rake spec:db:fixtures:load
手动加载我的测试装置。这是我的问题:
我有一个名为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"
我无法理解为什么它保存得非常好,但每当我拨打reload
或Listing.find
等时,它都会恢复原始记录。
感谢您阅读本文,如果我没有提供足够的信息,请提出任何问题。
感谢您的帮助, 内森B
P.S。我没有问题为其他类创建新记录,并测试这些记录。当我更新数据库中已存在的记录时,它似乎只是一个问题。
答案 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,你应该看到它;)