我真的不确定如何编写控制器测试。
给出是控制器操作之一。
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
现在我以两种方式来解决这个问题。
就像
get :pstn_rate_imports, id: 1, page: 1
expect(assigns(:pstn_rates_imports)).to eq(expected_result)
但是这里有一个问题,我现在需要确保我在DB上插入了正确的数据(担心在创建记录时会进行验证等操作) 另外,这不符合您引入的任何新机会都应该破坏测试的原则。
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中编写控制器测试的正确方法是什么。
答案 0 :(得分:0)
主要原理是编写仅涵盖测试对象功能的测试。
所以您需要:
pstn_rate_imports
方法)为模型方法创建相对测试.order
)。
一定要对模型的方法(如pstn_rate_imports
)进行存根。您可以了解有关存根here的更多信息。