在控制器中存储超级方法

use*_*655 4 rspec stub super

如何存根:包含模块的超级方法.我有以下控制器:

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)

谢谢你的所有答案.

Jor*_*ing 8

在红宝石super看起来像一个方法,但它实际上是具有特殊行为的关键字(例如,supersuper()做不同的事情,不同于所有其他的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)

根据你的其他规格,这可能会引入一些拆解的并发症,但我希望它有助于你开始.