Rspec 在调用_过滤器之前进行测试

Rspec 在调用_过滤器之前进行测试,rspec,ruby-on-rails,before-filter,Rspec,Ruby On Rails,Before Filter,如何测试当访问控制器中的某个操作时,该控制器的before_过滤器将被执行 before_筛选器在单独的示例组中进行测试,因此无需对依赖before_筛选器的所有操作重复测试 如果我有 controller.should_receive(:my_before_filter) 在我的例子中,它工作得很好。但是,具有上述期望似乎会导致未执行my_before_filter中的逻辑(它应该分配一个实例变量) 如何克服此限制或在过滤器之前模拟my_的行为(它在控制器上设置实例变量)?还是有更好的方法

如何测试当访问控制器中的某个操作时,该控制器的before_过滤器将被执行

before_筛选器在单独的示例组中进行测试,因此无需对依赖before_筛选器的所有操作重复测试

如果我有

controller.should_receive(:my_before_filter)
在我的例子中,它工作得很好。但是,具有上述期望似乎会导致未执行
my_before_filter
中的逻辑(它应该分配一个实例变量)

如何克服此限制或在过滤器之前模拟my_的行为(它在控制器上设置实例变量)?还是有更好的方法



现在很明显我做错了,我仍然想知道如何模拟设置实例变量的before_过滤器的行为。当然,在控制器规范中一定有可能做到这一点?

RSpec的should\u receive表示您希望接收该方法,但作为一个模拟方法,因此它实际上不会调用实际方法,在本例中,它是“my\u before\u filter”

如果我的\u before\u过滤器已经在一个单独的测试中进行了测试,正如您所说,您不应该真正关心调用的是真正的过滤器

因此,您应该在一个测试中测试实际功能,并测试它是否在另一个测试中被调用,就像您已经在做的那样

顺便说一句,如果您需要它返回一个值,您可以在下一页上看到“returnvalues”


测试筛选器时过于关注实现,IMO。您希望确保实例变量分配正在发生,而不是在筛选器或操作中发生——测试结果,而不是实现。

回答您的问题

“我仍然想知道,人们如何能够嘲笑他们的行为 设置实例变量的前过滤器。“

以下是我的答案:

controller.should_receive(:my_before_filter) 
controller.instance_variable_set(:@my_instance_var, "some value")

谢谢你的回复。然而,问题是,我至少需要一些方法来模拟我的\u过滤器之前的\u行为。从before_filter返回值不是很有用,因为唯一有意义的返回值是“false”,它会停止链的执行。我实际上想做的是让我的\u-before\u过滤器在控制器上设置一个实例变量。我试图嘲笑它,但没有成功。我应该如何继续控制器。是否应该接收(:my_before_filter)行,以便在示例中使用get:action_name之前分配一个实例变量?您的意思是,由于过滤器用于控制器内的许多操作,我应该复制为依赖实例变量的每个操作分配实例变量而创建的测试?这是一种折衷。诚然,您可能需要复制一些测试,但是如果重构实现,它们不太可能中断。您可以通过使用共享示例组来减少重复。另外,通过单独测试过滤器,您可能会得到更多的测试代码——您必须测试过滤器是否为正确的操作(而不是错误的操作)调用,以及实例变量赋值是否发生在它应该发生的地方。谢谢。我没有听说过共享示例组,但我肯定会看看他们是否能胜任这项任务。:)我在这里找到了一个很好的答案:我用它来期望
protect\u免受伪造
通过
expect(controller)关闭api。不希望接收(:验证真实性\u令牌)