如何在Rails中编写控制器测试

时间:2018-07-14 06:17:00

标签: ruby-on-rails rspec

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

给出是控制器操作之一。

  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)

但是这里有一个问题,我现在需要确保我在DB上插入了正确的数据(担心在创建记录时会进行验证等操作) 另外,这不符合您引入的任何新机会都应该破坏测试的原则。

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

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

     

期望(some_arel)。接收(:order).with('created_at desc'){some_arel}

     

期望(some_arel)。接收(:page).with('1'){some_arel}

     

期望(some_arel)。接收(:per).with(10){some_arel}

     

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

这可以确保如果我进行任何更改,测试都将失败。但是问题是我不确定如何mock the arel object or ActiveRecord method that returns an arel object

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

1 个答案:

答案 0 :(得分:0)

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

所以您需要:

  • 测试逻辑(pstn_rate_imports方法)为模型方法创建相对测试
  • 测试变量分配和控制器中控制器的特定逻辑(例如.order)。 一定要对模型的方法(如pstn_rate_imports)进行存根。您可以了解有关存根here的更多信息。