ruby-on-rails - 如何在 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
现在我以两种方式解决这个问题..
- 我可以在 PSTN 速率导入表中插入数据,然后对其进行测试。然后编写一个测试,它可能会验证返回的对象是否与测试结果期望完全匹配。
喜欢,
get :pstn_rate_imports, id: 1, page: 1
expect(assigns(:pstn_rates_imports)).to eq(expected_result)
但这里有一个问题,我现在需要确定我在数据库中插入了正确的数据(在创建记录时担心验证等)此外,这不符合您引入的任何新机会都应该破坏您的测试的原则.
- 或者我可以模拟 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 中编写控制器测试的正确方法是什么。
解决方案
主要原则是编写一个仅涵盖测试对象功能的测试。
所以你需要:
- 测试逻辑(
pstn_rate_imports
方法)为模型方法创建相关测试 - 在控制器中测试变量分配和控制器的特定逻辑(如
.order
)。模型的方法(如pstn_rate_imports
)肯定应该被存根。您可以在此处阅读有关存根的更多信息。
推荐阅读
- kentico - Kentico 12 DancingGoat MVC SiteName 为空或 null
- maven - 创建 Maven 插件
- java - 在一行中反序列化接口属性的对象?
- spring - 如何在spring-boot-starter-data-rest中为Swagger文档实现snake_case?
- linux - Bash 脚本检查远程运行命令的权限
- html - 带有溢出-x 的响应表:自动和溢出-y:可见不工作
- ios - Can I update an app while it's available for Pre-Order in the App-Store
- excel - 为什么我收到错误“应用程序定义或对象定义错误”?
- php - 比较两个相同的数组返回 false
- docker - 如何在调用之间保存 docker 状态数据?