我正在将Rails 2应用程序升级到Rails 3,并且不确定如何从我的一项测试中“升级”以下行

Category.should_receive(:find).with(:all,:conditions => {:parent_id => @parent_id}, :order => 'disp_order DESC').and_return(@categories_collection)

希望有人可以对此提供一些指导,因为我不确定100%从这里开始。

运行此命令时出现以下错误:

Failure/Error: Category.should_receive(:find).with(:all,
       (<Category(id: integer, permalink: string, name: string, parent_id: integer) (class)>).find(:all, {:conditions=>{:parent_id=>1}, :order=>"display_order DESC"})

* *更新1

我现在看到的东西真的很奇怪,我按照吉姆的解释进行了重构(顺便说一句伟大的解释!),但是现在得到以下信息:

Failure/Error: Category.should_receive(:with_parent).with(1).and_return(@sub_category)
       (<Category(id: integer, permalink: string, name: string, parent_id: integer) (class)>).with_parent(1)
           expected: 1 time
           received: 0 times

但是,如果我在测试中添加以下内容:

puts Category.with_parent(1).length.to_s

输出为“ 1”-正确/期望值。 由于某种原因,RSpec看不到此错误并抛出错误。 您知道为什么会这样吗?

* *更新2

好吧,有趣的是,如果我使用以下测试通过:

Category.with_parent(@parent_id).should == [@sub_category]

虽然失败了:

Category.should_receive(:with_parent).with(@parent_id).and_return(@sub_category)

在rspec2的此上下文中使用should_receive和.ad_return是否存在问题?

===============>>#1 票数:1

从测试的代码行来看,被测代码似乎是:

Category.find(:all, :conditions => {:parent_id => @parent_id}, :order => 'disp_order DESC')

在Rails 3中不推荐使用此语法,而推荐使用可链接的AREL调用,因此现在将相同的finder函数编写为:

Category.where(:parent_id => @parent_id).order('disp_order DESC')

您可能会说,由于方法链的原因,进行模拟将变得更加困难。 因此,最好的建议是将查找器重构为Category类上的一种方法(也许使用范围),该方法可以更容易地隔离和模拟。

例如:

class Category << ActiveRecord::Base

  scope :with_parent_id, lambda { |parent_id| where(:parent_id => parent_id).order('disp_order DESC') }

end

然后,您可以像这样模拟finder调用:

Category.should_receive(:with_parent_id).with(@parent_id).and_return(@categories_collection)

  ask by Jason translate from so

未解决问题?本站智能推荐:

关注微信公众号