我正在使用RSpec和Mocha进行一些控制器测试。这是一个例子
describe MenuItemsController, "creating a new menu item" do
integrate_views
fixtures :menu_items
it "should redirect to index with a notice on successful save" do
MenuItem.any_instance.stubs(:valid?).returns(true)
post 'create'
assigns[:menu_item].should_not be_new_record
flash[:notice].should_not be_nil
response.should redirect_to(menu_items_path)
end
end
我对这个例子有几个问题
post方法(和其他REST动词)的文档在哪里?
如何通过
创建对象MenuItem.any_instance.stubs(:valid?)。return(true)
传递给控制器动作?
问题2如何通过post方法直接将params传递给控制器?
答案 0 :(得分:0)
1
2
它并没有真正通过。 您正在配置您的测试用例,以便, 鉴于对有效?的调用是由MenuItem实例进行的。 然后将使用您的存根,并且此有效?检查的结果将为true。 您决定通过此有效?调用
返回的内容3
当您存根时,测试运行时,而不是正常执行代码 , 对于MenuItem实例上的此特定有效?;您的代码不会尝试确定您的menuItem是否有效。它只返回您在存根中指定的值。在你的情况下是真的
因此,在这里,您没有测试您的MenuItem实例在给定正确的参数的情况下返回true,但是您正在测试当MenuItem实例返回true时发生的情况。
如果您可以轻松设置包含参数的帖子,那么对您来说可能不是很有用,该参数将始终为您的MenuInstance项目生成valid? == true
。
但是,例如,当您有一段连接到WebService的代码时,您可以使用返回 Connection Unavailable 的存根来测试Web服务关闭时代码中发生的情况。
答案 1 :(得分:0)
您可以在Rails docs
对象未传递给控制器,它由控制器创建。 MenuItem.any_instance.stubs(:valid?).return(true)
确保在您的规范上下文中创建的任何 MenuItem
实例将为true
方法返回valid?
。
剔除方法的主要目的是隔离您正在测试的内容。如果您将params传递给控制器而不是只删除测试控制器所需的方法,那么您现在正在测试控制器和您的模型。由于您可能在其他地方指定了您的模型,因此复制只会使您的规格变得更加复杂和脆弱。
将valid?
方法命名为返回true
是较低的维护选项,与传递模型单独返回true
所需的所有参数相比较。