如何使用Minitest测试Rails控制器中的私有方法
问题原因
你遇到的报错是因为测试类中直接调用的test()方法不是你定义在控制器里的私有方法,而是Rails测试框架内置的、用于声明测试用例的方法,该方法预期接收字符串类型的测试用例名称作为入参,你传入数值1就会触发参数不匹配的错误。
正确调用方式
调用控制器私有方法需要按以下方式实现:
- 首先通过测试类内置的
@controller变量获取当前测试的PokerController实例 - 用Ruby的
send方法绕过私有方法的访问限制,调用目标私有方法
修改后的测试代码如下:
require 'test_helper' class PokerControllerTest < ActionController::TestCase test "check if test == 2" do result = @controller.send(:test, 1) assert_equal 2, result end end
补充说明
- 如果你的工具方法不依赖控制器的请求、响应等上下文,更建议把这类逻辑抽成独立的普通类放在lib目录下,脱离控制器单独测试,可维护性更强
send方法可以调用对象的任意方法(包括私有、保护方法),测试场景下使用是合理的,生产环境尽量避免随意使用破坏封装
内容的提问来源于stack exchange,提问作者Wes Creations
相关产品推荐
相关产品推荐

