我正在将一个方法从一个控制器转移到一个帮手;现在将从视图中调用该方法。以前,在我的控制器中我有
def show
@things = gather_things
end
在我的功能测试中我有
test "show assigns things" do
get :show
assert_equal GATHERED_THINGS, assigns(:things)
end
现在,gather_things
位于助手中,并从视图中调用。我有一个帮助器的单元测试,它确保它返回正确的值,但我希望我的功能测试断言它被调用。我试过了
test "show calls gather_things" do
@controller.expects(:gather_things)
get :show
end
但这不起作用。我该怎么称呼expects(:gather_things)
?
答案 0 :(得分:1)
如果您已将代码从控制器移到View中,那么它实际上已经超出了功能测试的范围。
我不知道正确的类来满足你的期望......但是你可以想象一下,在方法“gather_things”中做了类似的事情:logger.error self.class.name
- 它会吐出这个类为您命名为日志。然后你可以把你的期望放到那个班级。
现在我们谈到问题的关键......你是否已将该代码移到视图中?
我的意见是你不应该。设置模型对象的集合恰恰是控制器代码中的内容 - 如果您以后决定要在CSV文件中显示相同的数据,还是作为RESTful xml API,该怎么办? - 无论您使用什么视图,仍然需要实例化相同的对象集。因此,我的最终建议是将该方法再次移回控制器所在的位置。
编辑:以下是过时的建议,与此用户无关,但可能与其他人相关
如果您正在使用rspec进行测试 - 它doesn't actually render the views during a functional test(除非您专门打开它),因此任何名为表单视图的代码都不会执行。
如果你想测试View调用的东西,你需要打开它,或者在你的视图测试中测试它。