Ruby on rails Rails 3.2.21&;Rspec 3升级和许多期望失败-为什么?

Ruby on rails Rails 3.2.21&;Rspec 3升级和许多期望失败-为什么?,ruby-on-rails,ruby,ruby-on-rails-3,rspec,rspec3,Ruby On Rails,Ruby,Ruby On Rails 3,Rspec,Rspec3,重新措辞的问题 原来的问题似乎不清楚。让我再试一次 在RSpec控制器测试中,如何存根无法直接访问的对象的方法?具体而言: # foo_controller def show @object = Foo.find(params[:id]) @action = current_user.actions.create(foo: @object, ... ) # log view action # ... end # action.rb model belongs_to :use

重新措辞的问题

原来的问题似乎不清楚。让我再试一次

在RSpec控制器测试中,如何存根无法直接访问的对象的方法?具体而言:

# foo_controller
def show
  @object = Foo.find(params[:id])
  @action = current_user.actions.create(foo: @object, ... )     # log view action
  # ...
end

# action.rb model
belongs_to :user
belongs_to :object    # actually polymorphic, but not for this example
before_validation :cache_values
def cache_values
  if self.foo   # safety check
    # cache some attributes in action since Foo instances might get deleted
    self.attribute1 = self.foo.attribute1
    self.attribute2 = self.foo.attribute2  
    # ...      
  end
end
在控制器测试中,我想要存根
Foo
,因为创建它很昂贵。在Rails3和RSpec2.14中,我能够

expect(Foo).to receive(:find).with("123") { mock_model(Foo) }
Foo
的模拟实例将在
cache\u values
方法中访问。但是,这在Rails 3.2和rspec 3.1中不再适用。如果
操作
也是一个模拟,我可以使用它

expect(@mock_action).to receive(:foo) { mock_model(Foo) }

我意识到这可能是控制器测试的最佳方式,但我想了解如何在上述最低级别“捕获”ActiveModel关联数据库查找。

Rspec 3不支持
mock_model
方法;它已被提取成一块单独的宝石

参考:


包括此gem将修复失败的测试。

是的,我有此gem(抱歉,忘了提及,更新了上面的文本)。错误不是关于mock_模型的,问题是我的expect/allow没有“捕获”数据库查询。您是否遵循了升级指南?如果RSPEC 3中没有任何新的失败,而不是在RSPEC 2中,升级过程并没有给您一个警告警告,那么我们认为这是一个bug,我们要求您将其报告给GITHUB。我安装了TrStEnC,它重新修改了大部分语法变化,但我不知道RSPEC 2.99。我的主要抱怨是(显然)我不能再使用上面的
expect(Foo).to receive(:find).
语法来模拟AR关联了。或者我做错了什么。请提出一个问题——该语法应该适用于任何类型的对象。在我这样做之前,是否有可能访问
的ActiveModel内部语法在3.0和3.2之间更改了许多
类型的子对象,从而使该语法不再适用于Rails?我如何/在哪里可以检查这个?不知道,我已经多年没有使用Rails了。