【问题标题】:Rails 4: How to test Controller ActionRails 4:如何测试控制器动作
【发布时间】:2017-02-02 20:25:59
【问题描述】:

我如何实际测试这个控制器动作,我在我的 PurchasesController 中写道:

protect_from_forgery except: [:hook]
def hook
    params.permit! # Permit all Paypal input params
    status = params[:payment_status]
    if status == "Completed"
        @purchase = Purchase.find(params[:invoice])
        @purchase.update_attributes(status: status, transaction_id: params[:txn_id], purchased_at: Time.now)
        @purchase.save!
        @user = @tool.user
        @user.earned_money += @tool.price
        @user.save!
    end
    render nothing: true
end

最好使用我的 Rails 控制台?

路线:

post "/purchases/:id" => "purchases#show"
post "/hook" => "purchases#hook"

【问题讨论】:

  • 你想通过控制台进行测试吗?
  • @Shabini Rajadas 我想我可以将参数传递给路径并检查数据库是否有效......但我做错了。这可能吗?

标签: ruby-on-rails ruby ruby-on-rails-4 testing rails-console


【解决方案1】:

您不会通过 rails 控制台测试控制器。

Rails 中的控制器响应 HTTP 请求 - 当路由组件匹配传入请求时,它们会被实例化。因此,您将通过发送 HTTP 请求并检查响应来测试控制器。

您可以使用命令行工具cURL 或基于浏览器的 Postman 发送请求来手动测试您的控制器*。您可以使用 rails 控制台来检查副作用,例如数据库中的更改。

但是,您应该考虑使用自动测试工具,例如 MinitestRSpec,因为手动测试您的应用程序是一种有缺陷的方法。

【讨论】:

  • * - 有很多工具可以发送 HTTP 请求。这只是两个非常流行的例子。
  • 您可以在控制台中实例化一个控制器,但这需要您设置一个虚假请求,并且需要对导轨和机架的工作原理有相当多的了解。你不能只是pass the parameters to the path
【解决方案2】:

我不完全确定您是否可以通过控制台进行测试,除非您解耦/抽象正在执行的其他操作,然后独立测试单元。使用 RSpec/Minitest,尽管您只需要创建记录并向 /hook 路由发出 post 请求,并传递预期的参数:invoicetxn_idpayment_status

如果有帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    相关资源
    最近更新 更多