Заглушка RSpec: возврат параметра

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

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

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

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

person SirLenz0rlot    schedule 09.05.2011    source источник


Ответы (3)


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


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
person Wayne Conrad    schedule 09.05.2011
comment
Спасибо, это именно то, что я искал! Я знал, что ответ должен быть чем-то простым :) - person SirLenz0rlot; 09.05.2011
comment
@SirLenzOrlot, пожалуйста! Спасибо за галочку и счастливого взлома. - person Wayne Conrad; 09.05.2011
comment
Можно ли это совместить с ситуацией, когда последовательность играет роль (например, при первом вызове она возвращает параметр, при следующем возврате - разъединенный)? - person SirLenz0rlot; 13.10.2011
comment
@ Сэр, да, но это не похоже на простой способ сделать что-то. Почему бы просто не указать, что он должен получать (например) foo и возвращать foo, а затем получать bar и возвращать disabled? - person Wayne Conrad; 15.10.2011
comment
У меня есть два ответа на stackoverflow .com/questions/7754733/ - person SirLenz0rlot; 17.10.2011
comment
@ Сэр, хороший вопрос и хорошие ответы. Ответ Джейкоба С. есть то, что я имел в виду. - person Wayne Conrad; 17.10.2011

Метод заглушки устарел в пользу ожидаемого.

expect(object).to receive(:get_trace).with(anything) do |value| 
  value
end

https://relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/block-implementation

person Kiyose    schedule 26.02.2015
comment
разве это не должно быть allow вместо expect? - person Marko Avlijaš; 25.01.2017
comment
@MarkoAvlijaš, только если вы не хотите устанавливать ожидание вызова метода. - person sevenseacat; 21.11.2017

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

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] }

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

person Maxime Brehin    schedule 23.06.2017