RSpec Stubbing: вернуть параметр - PullRequest
22 голосов
/ 09 мая 2011

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

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

Примерно так:

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

Ответы [ 3 ]

29 голосов
/ 09 мая 2011

Примечание. Метод 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
18 голосов
/ 26 февраля 2015

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

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

2 голосов
/ 23 июня 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] }

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

...