Ruby on rails 使用rspec模拟载波波

Ruby on rails 使用rspec模拟载波波,ruby-on-rails,rspec,carrierwave,Ruby On Rails,Rspec,Carrierwave,我需要在不生成上传文件的情况下运行我的规范。 我已经在运行规范之后使用了清理策略,但是我想使用一个模拟来避免在项目中生成文件 我正在使用: allow_any_instance_of(CarrierWave::Storage::File).to receive(:store!).and_return nil 这段代码确实生成了文件,但在内部创建了一个名为tmp的文件夹:spec/support/uploads 有没有办法不生成这些文件并模拟存储方法?您需要使用双实例: let(:file) {

我需要在不生成上传文件的情况下运行我的规范。 我已经在运行规范之后使用了清理策略,但是我想使用一个模拟来避免在项目中生成文件

我正在使用:

allow_any_instance_of(CarrierWave::Storage::File).to receive(:store!).and_return nil
这段代码确实生成了文件,但在内部创建了一个名为tmp的文件夹:spec/support/uploads


有没有办法不生成这些文件并模拟存储方法?

您需要使用双实例:

let(:file) { instance_double(CarrierWave::Storage::File, store!: nil) }

before do
  allow(CarrierWave::Storage::File).to receive(:new) { file }
end
(可能将
allow
语句中的
CarrierWave::Storage::File
:new
替换为
CarrierWave::Storage::File
的实例;我不熟悉该gem或您的代码,但这是您试图实现的通用语法。)

建议如下:

  • (如果要模拟真实文件)

谢谢,但它不起作用。当我调用receive时:CarrierWave::Storage::File类中的其他新方法不允许代码工作:(如果需要调用其他方法,则需要在实例double中定义它们的模拟行为。我编写的实例double只模拟了store!方法;基本格式是
instance\u double(ModelName,method_name1:method_response1,method_name2:method_response2,…)
。如果您正在测试不需要保存/持久化对象(例如,通过数据库查询返回)的行为,您也可以在声明测试对象时尝试使用
build
build_stubbed
而不是
create
(例如:)。