Как заглушить любые экземпляры для данного класса с помощью Rspec Mocks

#ruby #mocking #rspec

#ruby #издевательство #rspec

Вопрос:

Следующий код выдает ошибку: undefined method 'any_instance' for String:Class

 require 'rspec'

RSpec.configure do |config|
  config.mock_with :rspec
end

describe String do
  it 'stubs' do
    String.any_instance.stub(:foo).and_return(1)
    ''.foo.should eq(1)
  end
end
  

Как я могу включить модуль Mocks в класс Class или Object class?

Ответ №1:

any_instance был недавно добавлен в rspec, поэтому ваш пример теперь работает для меня так же, как и с rspec 2.7.

Обновление для rspec 3:

Новый способ сделать это
allow_any_instance_of(String).to receive(:foo).and_return(1)

Вот дополнительная документация any_instance:https://relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/any-instance

Комментарии:

1. Rspec Mocks 3.0 doc: https://www.relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/any-instance

Ответ №2:

С RSpec Mocks в версиях, предшествующих 2.6.0, вы не можете этого сделать. Однако вы можете использовать any_instance с Mocha (как показано здесь) или в более поздних версиях Rspec.

В вашем spec/spec_helper.rb

Убедитесь, что у вас есть эта строка:

config.mock_with :mocha

без комментариев.

Комментарии:

1. Ну, учитывая, что вопрос заключается в «использовании Rspec Mocks», я не уверен, что ответ «не использовать Rspec Mocks» полезен. Опять же, это лучше, чем технически правильный ответ: вы не можете этого сделать.

2. Приведенный выше тест на самом деле является тестом из самой ссылки Rspec. И модуль AnyInstance включается через (mocks.rb): Class.class_eval { include RSpec::Mocks::AnyInstance } Я думаю, что есть способ как-то это сделать.

3. Это текущий мастер, но он еще не выпущен. Это будет частью выпуска rspec-mocks-2.6.0 в течение следующей недели или двух.

4. Я в версии 2.7.1, но у меня тоже похожая проблема