测试before_filter会被调用

时间:2010-07-07 10:20:02

标签: rspec ruby-on-rails before-filter

如何测试当控制器中的操作被访问时,控制器的before_filter将被执行?

before_filter在单独的示例组中进行测试,因此不需要为依赖于before_filter的所有操作复制测试。

如果我有

controller.should_receive(:my_before_filter)

在我的例子中,它工作正常。但是,具有上述期望似乎导致my_before_filter中的逻辑未被执行(它应该分配实例变量)。

如何克服此限制或模拟my_before_filter的行为(它在控制器上设置实例变量)?或者有更好的方法来做到这一点吗?


现在很明显我做错了,我仍然想知道如何模拟设置实例变量的before_filter的行为。当然,在控制器规范中一定可以这样做吗?

3 个答案:

答案 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")