首页 > 解决方案 > 如何在 Rails 中编写控制器测试

问题描述

我真的不确定如何编写控制器测试。

Given 是控制器动作之一。

  class AccountsController < ApplicationController
    def pstn_rate_imports
        page = params[:page] || 1
        @pstn_rate_imports = @resporg_account_id.pstn_rate_imports.order('created_at desc').page(page).per(10)
        @pstn_rate_import = PstnRateImport.new
      end
   end

现在我以两种方式解决这个问题..

  1. 我可以在 PSTN 速率导入表中插入数据,然后对其进行测试。然后编写一个测试,它可能会验证返回的对象是否与测试结果期望完全匹配。

喜欢,

get :pstn_rate_imports, id: 1, page: 1
expect(assigns(:pstn_rates_imports)).to eq(expected_result)

但这里有一个问题,我现在需要确定我在数据库中插入了正确的数据(在创建记录时担心验证等)此外,这不符合您引入的任何新机会都应该破坏您的测试的原则.

  1. 或者我可以模拟 ActiveRecord 调用。

expect_any_instance_of(ResporgAccountId).to receive(:pstn_rate_imports) { some_arel }

期望(some_arel).to receive(:order).with('created_at desc') { some_arel }

期望(some_arel).to receive(:page).with('1') { some_arel }

期望(some_arel).to receive(:per).with(10) { some_arel }

获取:pstn_rate_imports,id:1,页面:1

这确保了如果我更改任何内容,测试将失败。但问题是我不知道该怎么做mock the arel object or ActiveRecord method that returns an arel object

那么在 Rails 中编写控制器测试的正确方法是什么。

标签: ruby-on-railsrspec

解决方案


主要原则是编写一个仅涵盖测试对象功能的测试。

所以你需要:

  • 测试逻辑(pstn_rate_imports方法)为模型方法创建相关测试
  • 在控制器中测试变量分配和控制器的特定逻辑(如.order)。模型的方法(如pstn_rate_imports)肯定应该被存根。您可以在此处阅读有关存根的更多信息。

推荐阅读