如何存根:包含模块的超级方法.我有以下控制器:
class ImportsController < BaseController
include ImportBackend
def import_from_file
super
rescue TransferPreview::Error => exc
flash[:error] = "Some String"
redirect_to imports_path
end
end
Run Code Online (Sandbox Code Playgroud)
和importBackend模块:
module ImportBackend
def import_from_file
//something
end
end
Run Code Online (Sandbox Code Playgroud)
我想测试那个控制器.我的问题是如何在ImportBackend中存根方法来引发错误?我试过几个解决方案但没有任何作用
ImportBackend.stub(:import_from_file).and_raise(Transfer::Error)
controller.stub(:super).and_raise(Transfer::Error)
controller.stub(:import_from_file).and_raise(Transfer::Error)
Run Code Online (Sandbox Code Playgroud)
谢谢你的所有答案.
在红宝石super看起来像一个方法,但它实际上是具有特殊行为的关键字(例如,super和super()做不同的事情,不同于所有其他的Ruby方法),你不能存根它.
你真正想要做的是存根super调用的方法,在这种情况下是ImportBackend#import_from_file.因为它是来自模块(而不是超类)的mixin,所以你不能以通常的方式存根.但是,您可以定义一个具有所需模拟行为的虚拟模块,以及include它在您的类中.这是有效的,因为当多个模块定义mixin时,super将调用包含的最后一个.您可以在此处详细了解此方法.在你的情况下,它看起来像这样:
mock_module = Module.new do
def import_from_file
raise Transfer::Error
end
end
controller.singleton_class.send(:include, mock_module)
Run Code Online (Sandbox Code Playgroud)
根据你的其他规格,这可能会引入一些拆解的并发症,但我希望它有助于你开始.
| 归档时间: |
|
| 查看次数: |
1781 次 |
| 最近记录: |