#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, но у меня тоже похожая проблема