如何测试当控制器中的操作被访问时,控制器的before_filter将被执行?
before_filter在单独的示例组中进行测试,因此不需要为依赖于before_filter的所有操作复制测试。
如果我有
controller.should_receive(:my_before_filter)
在我的例子中,它工作正常。但是,具有上述期望似乎导致my_before_filter
中的逻辑未被执行(它应该分配实例变量)。
如何克服此限制或模拟my_before_filter的行为(它在控制器上设置实例变量)?或者有更好的方法来做到这一点吗?
现在很明显我做错了,我仍然想知道如何模拟设置实例变量的before_filter的行为。当然,在控制器规范中一定可以这样做吗?
答案 0 :(得分:7)
测试过滤器正在密切关注IMO的实施。您希望确保实例变量分配正在发生,而不是发生在过滤器内还是在操作中 - 测试结果,而不是实现。
答案 1 :(得分:3)
RSpec的should_receive意味着你期望接收方法,但作为一个模拟方法,所以它实际上并没有调用真正的方法,在这种情况下是“my_before_filter”。
http://axonflux.com/rspecs-shouldreceive-doesnt-ac
如果my_before_filter已经在单独的测试中进行了测试,正如您所说,您不应该真正关心真正的测试。
因此,您应该在一个测试中测试实际功能,并测试它是否正在另一个测试中调用,就像您已经在做的那样。
顺便提一下,如果您需要它来返回一个值,您可以在下一页看到“返回值”。
http://rspec.info/documentation/mocks/message_expectations.html
答案 2 :(得分:1)
回复你的问题
“我仍然想知道如何嘲笑他们的行为 before_filter设置实例变量。“
这是我的答案:
controller.should_receive(:my_before_filter)
controller.instance_variable_set(:@my_instance_var, "some value")