Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Rspec 2和轨道3短截线/模拟_Ruby On Rails 3_Mocking_Find_Rspec2_Stubbing - Fatal编程技术网

Ruby on rails 3 Rspec 2和轨道3短截线/模拟

Ruby on rails 3 Rspec 2和轨道3短截线/模拟,ruby-on-rails-3,mocking,find,rspec2,stubbing,Ruby On Rails 3,Mocking,Find,Rspec2,Stubbing,我目前正在一个大型应用程序中从rails 2迁移到rails 3。在我们的功能规格中,我们有很多类似的东西: @model = Factory :model @child = Factory :child Model.stub!(:find).and_return(@model) Child.stub!(:find).and_return(@child) ... @child.should_receive(:method).twice 主要的问题是,如果我让它命中DB并得到实际的child

我目前正在一个大型应用程序中从rails 2迁移到rails 3。在我们的功能规格中,我们有很多类似的东西:

@model = Factory :model
@child = Factory :child
Model.stub!(:find).and_return(@model)
Child.stub!(:find).and_return(@child)

...

@child.should_receive(:method).twice
主要的问题是,如果我让它命中DB并得到实际的child实例,real:method会使测试太复杂(需要两个大工厂)而且速度很慢

在代码中,我们使用各种方式来获取项:查找、动态查找等

@model = Model.find(1)    
@child = @model.children.find_by_name(name)

您如何建议将此逻辑移动到rails 3?关于另一个存根/模拟库有什么建议吗?

通常您会在控制器规格内模拟模型:

Model.stub!(:find.)和返回(mock_model('model'))
孩子,存根!(:find.)和返回(mock_model('Child'))
但是,当您在rails 3应用程序的gem文件中有
gem“rspec rails”、“~>2.0”
时,标准rails脚手架生成器将使用rspec为您生成规范,因此运行
rails generate scaffold MyResource
将为您生成一些示例规范

下面是rails/rspec将为控制器规范生成的一个稍加注释的版本,因此我认为这应该被视为“rspec方式”

描述帐户控制器的操作
#返回帐户模型的模拟版本的Helper方法。
def模拟账户(存根={})
(@mock_account | |=mock_模型(account).as_null_对象)。点击do|account|
帐户存根(存根),除非存根为空?
结束
结束
描述“获取索引”的方法
它“将所有帐户分配为@accounts”
#将块传递给存根以指定返回值
Account.stub(:all){[mock_Account]}
获取:索引
#还针对mock进行了断言
分配(:帐户)。应eq([模拟帐户])
结束
结束
描述“得到表演”做什么
它“将请求的帐户分配为@account”do
Account.stub(:find).with(“37”){mock_Account}
获取:show,:id=>“37”
分配(:帐户)。应为(模拟帐户)
结束
结束
描述“获得新的”做什么
它“将新帐户分配为@account”do
Account.stub(:new){mock_Account}
获取:新
分配(:帐户)。应为(模拟帐户)
结束
结束
结束

我很高兴能给你第一次投票:)我在问一个关于RSpec的类似问题时发现了这个问题(大卫·切里姆斯基回答了这个问题!)。无论如何,很高兴在这里见到你:)