我试图在RSpec中测试一个Rails控制器问题(虽然我不确定这个问题与我的问题有什么关系),所以我想我会使用一个匿名控制器。这是我的设置:
describe MyConcern do
controller do
include MyConcern
def edit
puts "Checkpoint!"
@value = concern_method
render text: "test edit method called"
end
end
it "should call concern_method" do
get :edit, id: 1
assigns(:value).should eq "expected_value" # Set by concern_method
end
end
现在这里是奇怪的部分。我用Guard测试。当Guard检测到spec文件的保存并运行此测试时,它会通过并打印Checkpoint!
。每次,完全确定。我可以继续保存文件,它不断传递。 (如果有帮助,Guard使用Spring并运行RSpec。)
但是当我使用RSpec命令运行测试时,它会失败。最奇怪的是,我原本预计会发生失败,因为匿名控制器设置会发生一些奇怪的事情并且无法找到路线,相反,它会导致测试失败的should
。当我以这种方式手动运行RSpec时,Checkpoint!
永远不会打印,表示匿名控制器操作未被调用。但是因为我没有得到路由错误,某些控制器操作必须被调用但我不知道是什么,因为我甚至没有任何其他匿名控制器带有{ {1}}可能发生冲突的功能。我试过重启春天 - 没有运气。
关于我可能做错什么的任何想法?
修改
这里有更多信息。我担心的格式是:
edit
当测试失败时(从我用module MyConcern
extend ActiveSupport::Concern
included do
puts "Included!"
private
def concern_method
puts "Method is called!"
"expected_value"
end
end
end
明确地运行RSpec),我得到了一个非常典型的失败消息:
bundle exec rspec
我的Guardfile的顶部只是Failure/Error: assigns(:value).should eq "expected_value"
expected: "expected_value"
got: nil
(compared using ==)
,即使从该命令中删除guard :rspec, cmd: 'bundle exec spring rspec --color'
,这种行为也是一样的。我真的不知道如何调试这个。
答案 0 :(得分:1)
我认为controller
receives an argument将被用作基类,如果你没有通过它,它将使用你describe
的东西。所以你的测试很可疑:)。
尝试:
controller(ApplicationController) do
...
end