如何测试Rails 4中的控制器问题

在Rails 4控制器中使用时,处理问题测试的最佳方法是什么?假设我有一个小问题引用

模块引用
扩展ActiveSupport::关注点
def引用;终止
终止

测试中的预期行为是,任何包含此问题的控制器都将获得此引用端点

类对话控制器<ActionController::Base
包括引文
终止

简单

ConversationController.new.response\u to?:大喊大叫#=>符合事实的

但是,孤立地测试这种担忧的正确方法是什么

类控制器<ActionController::Base
包括引文
终止
描述控制器,类型::控制器do
它“应该添加引用端点”这样做
获得:引用
期待(回应)。成功
终止
终止

不幸的是,这失败了

控制器
应添加引用终结点(失败-1)
失败:
1) 引文控制器应添加引文端点
失败/错误:获取:引用
ActionController::UrlGenerationError:
没有路由匹配{:controller=>“引文关注点”,:action=>“引文”}
#/控制器问题规范rb:14:in'块(2级)in<顶部(必需)>'

这是一个人为的例子。在我的应用程序中,我得到一个不同的错误

运行时错误:
@路由为零:确保在测试的设置方法中设置了路由。

您会发现许多建议告诉您使用共享示例,并在包含的控制器范围内运行它们

我个人认为这比杀戮更重要,我更喜欢单独执行单元测试,然后使用集成测试来确认我的控制器的行为

方法1:无路由或响应测试

创建假控制器并测试其方法:

描述MyController关注的问题
在做之前
类假控制器<应用控制器
包括我的问题
终止
终止
事后
Object.send:remove_const,:FakesController
终止
let(:object){FakesController.new}
这是我的测试方法
expect(object).to eq('expected result')
终止
终止

方法2:测试响应

当您的问题包含路由或需要测试响应、渲染等时。。。您需要使用匿名控制器运行测试。这允许您访问所有与控制器相关的rspec方法和帮助程序:

描述MyControllerConcern,type::controller do
控制器(应用程序控制器)do
包括我的问题
def假动作;将_重定向到“/an_url”;终止
终止
在做之前
抽签{
获取“假动作”=>“匿名假动作”
}
终止
描述“我的测试方法”是什么
在做之前
获得:假动作
终止
是的
预期(响应)。将_重定向到('/an_url'))
终止
终止
终止

如您所见,我们使用controller(ApplicationController)定义匿名控制器。如果您的测试涉及的是另一个类,而不是ApplicationController,则需要对此进行调整

此外,要使其正常工作,您必须在spec\u helper.rb文件中配置以下内容:

config.expert\u base\u class\u for\u anonymous\u controllers=true

注意:继续测试您的问题是否包括在内

测试您的关注类是否包含在目标类中也很重要,一行就足够了:

描述TargetedController要做的事情
它“包括MyControllerConcern”do
期望(SomeTargetedController.Procents.include?MyControllerConcern.)为(true)
终止
终止

发表评论