使用Sinatra和rspec对控制器方法进行存根

时间:2009-12-11 16:37:31

标签: ruby rspec sinatra

所以我试图想出一种方法来为一个Sinatra应用程序在rspec中存储一个控制器方法。其主要原因是测试应用程序的逻辑流程,并确保在满足某些条件时调用必要的函数。所以,从本质上讲,我希望能够做到像

这样的事情
controller.should_receive(:fancy_method).and_return("This is a string")

我遇到的困难是访问sinatra应用程序中的控制器实例。我能够使用sinatra控制器类上的class_eval覆盖当前函数,但是我想断言这些函数实际运行。

有人有什么建议吗?

感谢。

1 个答案:

答案 0 :(得分:3)

丹,我相信你真正想要的只是测试控制器动作。从测试人员的角度来看,你不应该真正关心它实际调用的是什么,而是关注输出,给定一个特定的输入和可能一些其他特殊条件(即模拟或存根其他类)(1)

您可以查看official documentation for Sinatra + Rack::Testthis blog post from devver.net

(1):如果您的控制器页面正在调用其他类(模型,服务等),您可以模拟这些并对它们加以预期。例如:

SomeClass.should_receive(:msg).with(:arg).and_return(:special_value)

可以在RSpec documentation pages上找到更多关于模拟的信息(在此例子中使用RSpec)。