RSpec Stubbing: возвращает параметр
Хотя мой вопрос довольно прост, мне не удалось найти ответ:
Как я могу заглушить метод и вернуть сам параметр (например, метод, который выполняет операцию массива)?
Что-то вроде этого:
interface.stub!(:get_trace).with(<whatever_here>).and_return(<whatever_here>)
Ответы
Ответ 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
Ответ 2
Метод заглушки устарел в пользу ожидания.
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
Ответ 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] }
Этот заглушка возвращает путь к файлу.