Подтвердить что ты не робот

RSpec Stubbing: возвращает параметр

Хотя мой вопрос довольно прост, мне не удалось найти ответ:

Как я могу заглушить метод и вернуть сам параметр (например, метод, который выполняет операцию массива)?

Что-то вроде этого:

 interface.stub!(:get_trace).with(<whatever_here>).and_return(<whatever_here>)
4b9b3361

Ответ 1

Примечание. Метод заглушки устарел. См. этот ответ для современного способа сделать это.


stub! может принимать блок. Блок получает параметры; возвращаемое значение блока - это возвращаемое значение заглушки:

class Interface
end

describe Interface do
  it "should have a stub that returns its argument" do
    interface = Interface.new
    interface.stub!(:get_trace) do |arg|
      arg
    end
    interface.get_trace(123).should eql 123
  end
end

Ответ 3

Вы можете использовать allow (заглушка) вместо expect (mock):

allow(object).to receive(:my_method_name) { |param1, param2| param1 }

С именованными параметрами:

allow(object).to receive(:my_method_name) { |params| params[:my_named_param] }

Вот пример реальной жизни:

Предположим, что мы имеем S3StorageService, который загружает наши файлы на S3 с помощью метода upload_file. Этот метод возвращает прямой URL S3 в наш загруженный файл.

def self.upload_file(file_type:, pathname:, metadata: {}) …

Мы хотим отключить эту загрузку по многим причинам (автономное тестирование, повышение производительности...):

allow(S3StorageService).to receive(:upload_file) { |params| params[:pathname] }

Этот заглушка возвращает путь к файлу.