- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试使用 Action Controller bug report template 解决 Rails 中的一个奇怪行为.
为了记录,这是模板中的 Controller :
class TestController < ActionController::Base
include Rails.application.routes.url_helpers
def index
render text: 'Home'
end
end
我已经为缺失的 Action 添加了一条路线:
routes.draw do
get '/' => 'test#index'
get '/missing' => 'test#missing'
end
并且我试图断言 AbstractController::ActionNotFound
在遵循该路线时被引发:
class BugTest < Minitest::Test
include Rack::Test::Methods
def test_missing
assert_raises(AbstractController::ActionNotFound) { get '/missing' }
end
private
def app
Rails.application
end
end
预期行为:绿色测试。
实际行为:
# Running tests:
D, [2014-04-24T09:17:41.948985 #4497] DEBUG -- :
D, [2014-04-24T09:17:41.949029 #4497] DEBUG -- :
I, [2014-04-24T09:17:41.949094 #4497] INFO -- : Started GET "/missing" for 127.0.0.1 at 2014-04-24 09:17:41 +0200
F, [2014-04-24T09:17:41.951337 #4497] FATAL -- :
AbstractController::ActionNotFound (The action 'missing' could not be found for TestController):
[stacktrace]
1) Failure:
BugTest#test_missing [action_controller_gem.rb:45]:
AbstractController::ActionNotFound expected but nothing was raised.
所以,基本上,引发了异常,但 Minitest 声称没有引发任何异常。我在这里被难住了。
为什么 Minitest 不能断言 AbstractController::ActionNotFound
被引发了?我查看了 Rack::Test::Methods
以排除 get
与线程或其他东西一起工作但找不到任何东西。
我还查看了 implementation of assert_raises
-- 没有什么明显的。
为什么 assert_raises(AbstractController::ActionNotFound) { get '/missing' }
没有通过?
(不要介意这已经在 Rails 中测试过的事实。我正在努力克服这个问题以获得真正的交易。)
最佳答案
这不是 assert_raises
的问题,它继续正常工作。您遇到的问题是您在 Rails 应用程序中引发的异常正在由您的 Rails 应用程序处理,而不是传播到您的测试。调用 get '/missing'
会引发 AbstractController::ActionNotFound
错误,但随后您的应用会处理错误并向客户端返回适当的响应(404 或 500)(你的测试)。
好的,那么您将如何测试您的 Controller 是否确实引发了您预期的错误?通常,您只需使用 ActionController::TestCase
测试来测试您的 Controller 。但是,当您在不在 ActionController::TestCase
中的 Controller 上调用操作时,您会得到一个不同的错误。所以如下:
require "test_helper"
class TestControllerTest < ActionController::TestCase
def test_missing
assert_raises AbstractController::ActionNotFound do
get :missing
end
end
end
产生以下输出:
1) Failure:
TestControllerTest#test_missing [test/controllers/test_controller_test.rb:6]:
[AbstractController::ActionNotFound] exception expected, not
Class: <ActionController::UrlGenerationError>
Message: <"No route matches {:action=>\"missing\", :controller=>\"test\"}">
---Backtrace---
test/controllers/test_controller_test.rb:7:in `block in test_missing'
test/controllers/test_controller_test.rb:6:in `test_missing'
---------------
原因是因为 ActionController::TestCase
知道路由并且不允许调用不在路由中的操作。但这正是您要测试的。而且,我假设您为什么不使用 ActionController::TestCase
。
在这一点上,我想知道您是否没有测试一些您不应该做的事情。也许您应该允许 Rails 完成它的工作并相信它的行为是正确的。但是,嘿,我们已经走到这一步了,为什么不一路走下去,测试一下 Rails 测试的内容。让我们尝试直接调用 TestController
,而不是通过完整的 Rails 应用程序进行调用。如果我们创建 Controller 的一个新实例,我们可以要求它处理一个 Action ,即使该 Action 没有在 Controller 上定义。但要做到这一点,我们将不得不深入研究 ActionController 的工作原理并利用 AbstractController#process
方法:
require "test_helper"
class TestControllerTest < Minitest::Test
def test_missing
assert_raises AbstractController::ActionNotFound do
TestController.new.process :missing
end
end
end
现在我们要求 Controller 处理一个不存在的 Action ,并测试 Controller 的行为是否符合预期。好吗?
关于ruby - 为什么 Minitest 的 assert_raises 在这种情况下没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264064/
我目前正在学习 Zed A. Shaw 的“用困难的方式学习 Python”,我在使用 assert_raises 练习 49 时遇到了很多麻烦。这是我在测试文件中使用的代码: def test_pa
我正在研究 Exercise 49 of Learn Ruby the Hard Way 练习要求为提供的每个函数编写单元测试。我正在测试的项目之一是是否引发了适当的异常。建议我们为此使用assert
好的,问题来了:在exercise 49在 Zed Shaw 的“Learn Python the Hard Way”一文中,我们需要使用 assert_raises() 测试几个异常。这是我正在测试
我正在使用 nose 1.1.2 为 Python 项目编写测试。文档中恰好提到了这个 assert_raises 函数,但我在任何地方都找不到它。 它应该是这样的东西的简写: value_error
下面的测试是否应该断言抛出了异常?在我的电脑上它没有,我想知道这是否是预期的行为。 def a raise RuntimeError end def b begi
我有要测试的代码: from random import randint class End(object): def __init__(self): s
我正在尝试为 python 项目编写一些 Nose 测试。自从我上次写一些 nostests 以来已经有一段时间(一年左右)了,看起来 nose2 是现在建议使用的模块。 我想编写一个测试来检查当错误
我有程序 factorial.rb 和 test_factorial.rb。前者看起来像这样: def factorial(n) (1..n).inject(:*) || 1 end test_f
我正在尝试使用 Action Controller bug report template 解决 Rails 中的一个奇怪行为. 为了记录,这是模板中的 Controller : class Test
我无法让 assert_raise 识别 java 异常。 我可以 assert_raise(NativeException) { @iter.next } 效果很好,但如果我尝试更具体一些 java
在 MiniTest 的 assert_raises/must_raise 中检查异常消息的预期语法是什么? 我正在尝试做出如下断言,其中 "Foo" 是预期的错误消息: proc { bar.do_
我是一名优秀的程序员,十分优秀!