【问题标题】:Variable Passing in Rails Controller TestsRails 控制器测试中的变量传递
【发布时间】:2009-11-04 21:04:26
【问题描述】:

我正在使用 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?).returns(true)

    传递给控制器​​动作?

  3. 问题 2 与通过 post 方法直接将参数传递给控制器​​有何不同?

【问题讨论】:

    标签: ruby-on-rails testing rspec mocha.js


    【解决方案1】:

    1.

    对于Post

    对于Get

    对于Put

    对于Delete

    2.

    它并没有真正通过。 您正在配置您的测试用例,以便, 假设对 valid? 的调用是由 MenuItem 实例进行的。 然后将使用您的存根,并且此 valid? 检查的结果将为真。 您正在决定这个 valid? 调用将返回什么

    3.

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

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

    如果您可以轻松地设置一个带有参数的帖子,这对您来说可能不是真的有用,该参数将始终为您的 MenuInstance 项生成 valid? == true

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

    【讨论】:

    • 文档链接不再有效。
    【解决方案2】:
    1. 您可以在 Rails docs 中找到测试 REST 方法的文档

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

    3. 存根方法的主要目的是隔离您正在测试的内容。如果您将参数传递给控制器​​,而不是仅存根测试控制器所需的方法,那么您现在正在测试您的控制器您的模型。由于您可能已经在其他地方指定了您的模型,因此重复只会使您的规范更加复杂和脆弱。

      与传递使模型自行返回true 所需的所有参数相比,将valid? 方法存根以返回true 的维护成本较低。

    【讨论】:

    • 文档链接不再有效。
    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多