Среда-заглушка RSpec оставляет желать лучшего, и это одна из тех вещей. stub!(:something).with("a thing")
гарантирует, что каждый раз, когда вызывается метод something
, он получает "a thing"
в качестве ввода. Если он получит что-то отличное от "a thing"
, RSpec остановит тест и сообщит об ошибке.
Я думаю, что вы можете достичь того, чего хотите, вам просто нужно подойти к этому немного по-другому. Вместо того, чтобы заглушить FileTest
, вы должны заглушить метод в вашем экземпляре @loader
, и этот метод обычно вызывает FileTest.exists?
. Надеюсь, это демонстрирует, что я получаю:
class MovieLoader
def load_file
perform_loading if file_exists?(file_path)
end
def file_exists?(path)
FileTest.exists? path
end
end
Ваш тест будет выглядеть так:
it "returns no error if file does exist" do
@loader = MovieLoader.new
lambda {
@loader.stub!(:file_exists?).with(MovieLoader.data_file).and_return(true)
@loader.load_file
}.should_not raise_error("File Does Not Exist")
end
Теперь вы заглушаете только один экземпляр загрузчика, поэтому другие экземпляры не будут наследовать заглушенную версию file_exists?
. Если вам нужно быть более детальным, вам, вероятно, придется использовать другую среду создания заглушек, которую поддерживает RSpec (stubba, mocha и т. Д.).