Ruby on rails Rails测试::单元不工作。但应用程序可以工作,控制台也可以工作,甚至Test::Unit中的控制台也可以工作

Ruby on rails Rails测试::单元不工作。但应用程序可以工作,控制台也可以工作,甚至Test::Unit中的控制台也可以工作,ruby-on-rails,unit-testing,testing,Ruby On Rails,Unit Testing,Testing,我有一个只更新属性的方法: @objects.each do |thingamabobber| thingamabobber.update_attributes( { attribute_one: false, attribute_two: true } ) end 它做的更多一点,但在大多数情况下,就是这样。我在更新部分之前和之后放置了一个调试器。我注意到,在运行Unit::Test时,它不会更新属性 但是,如果在同一个调试器中,只需在Test::Unit控制台中复制并粘贴代码,它将无错

我有一个只更新属性的方法:

@objects.each do |thingamabobber|
  thingamabobber.update_attributes( { attribute_one: false, attribute_two: true } )
end
它做的更多一点,但在大多数情况下,就是这样。我在更新部分之前和之后放置了一个调试器。我注意到,在运行Unit::Test时,它不会更新属性

但是,如果在同一个调试器中,只需在Test::Unit控制台中复制并粘贴代码,它将无错误地更新。如果我使用Rails控制台,或者将应用程序作为一个整体使用,这一点也适用。一切正常。除了考试

注意,在我的测试对象中没有任何东西被打断。我正在使用Factory girl创建我的对象

此外,如果我在测试中抛出调试器,并对我正在更新的属性运行一个集合,它们将返回,而不会改变,,但仍然通过测试,也就是说,除了一个测试确保更新了属性

这告诉我..Test::Unit正在默默地处理数据,它失败了,但不是因为它告诉我的任何原因

有人知道这可能是什么症状吗

更新

这里是真正简化的:

should "update all items" do
  @item.items.last.update_all_recurring_items( {"name" => 'Ooooohhhh Yeeeeeea! Kooolaid Goooooood!'} )
  assert_equal @item.name, @item.items.last.name
end
然后,我的模型中的方法:

def update_all_recurring_items params = {}
  parent = self.recurring_items.present? ? self : Item.find(self.recurring_item_id)
  parent.recurring_items.each do |item|
    # Everything ok up to here. If I run the below method it works.
    item.update_attributes( params )
    # But! The Test Suit just skips over this like nothing ever happened.
  end
  parent.update_attributes(params) if self != parent
end

我意识到答案是重新加载对象,以便测试实例化该对象

因此,只要这样做:

@object.reload
允许所有测试通过,控制台反映Test::Unit中的更改


不过,我很好奇为什么会这样。

您有任何验证吗<代码>更新属性检查验证,检查
@item.items.last.errors
可能?Hmmm。。没有,没有错误。它通过了所有验证,因为它在应用程序、控制台、Test::Unit控制台中工作,但在测试中不工作。我只是在想,也许在测试中,您创建的对象有所不同,这可能会导致验证失败。您能在
test.log
中看到执行了正确的
INSERT/UPDATE
语句吗?感谢Nathanvda的评论。在仔细检查日志时,我注意到在发布保存点之后出现了一个
回滚。我将展示上面的相关部分。哈!如果您执行
@item.items.last.update\u recurtive\u items
操作,您将从父级获取所有项目,但由于rails当前未使用标识映射,此更改存储在数据库中,但不存储在
@item.items.last
中,因此实际上:您必须执行
@item.items.last.reload
操作才能与数据库同步。清楚了吗?在web使用中,这在大多数情况下都不是问题,因为在下一次请求时,所有数据都会自动重新加载。我以为这就是原因,但现在你具体说明了发生了什么。我很感激。谢谢