Rails控制器测试中的可变传递

时间:2009-11-04 21:04:26

标签: ruby-on-rails testing rspec mocha

我正在使用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

我对这个例子有几个问题

  1. post方法(和其他REST动词)的文档在哪里?

  2. 如何通过

    创建对象

    MenuItem.any_instance.stubs(:valid?)。return(true)

    传递给控制器​​动作?

  3. 问题2如何通过post方法直接将params传递给控制器​​?

2 个答案:

答案 0 :(得分:0)

1

Post

Get

Put

Delete

2

它并没有真正通过。 您正在配置您的测试用例,以便, 鉴于对有效?的调用是由MenuItem实例进行的。 然后将使用您的存根,并且此有效?检查的结果将为true。 您决定通过此有效?调用

返回的内容

3

当您存根时,测试运行时,而不是正常执行代码 , 对于MenuItem实例上的此特定有效?;您的代码不会尝试确定您的menuItem是否有效。它只返回您在存根中指定的值。在你的情况下是真的

因此,在这里,您没有测试您的MenuItem实例在给定正确的参数的情况下返回true,但是您正在测试当MenuItem实例返回true时发生的情况。

如果您可以轻松设置包含参数的帖子,那么对您来说可能不是很有用,该参数将始终为您的MenuInstance项目生成valid? == true

但是,例如,当您有一段连接到WebService的代码时,您可以使用返回 Connection Unavailable 的存根来测试Web服务关闭时代码中发生的情况。

答案 1 :(得分:0)

  1. 您可以在Rails docs

  2. 中找到测试REST方法的文档
  3. 对象未传递给控制器​​,它由控制器创建。 MenuItem.any_instance.stubs(:valid?).return(true)确保在您的规范上下文中创建的任何 MenuItem实例将为true方法返回valid?

  4. 剔除方法的主要目的是隔离您正在测试的内容。如果您将params传递给控制器​​而不是只删除测试控制器所需的方法,那么您现在正在测试控制器您的模型。由于您可能在其他地方指定了您的模型,因此复制只会使您的规格变得更加复杂和脆弱。

    valid?方法命名为返回true是较低的维护选项,与传递模型单独返回true所需的所有参数相比较。

    < / LI>