Достаточно сложно найти документацию на Mocha, так что, боюсь, я здесь полностью в море. Я нашел проблему с методами stubbing, которые передают аргументы. Так, например, если я создал класс вроде этого:Странная ошибка при попытке тестирования метода с аргументом в Mocha. Это ошибка или это я?
class Red
def gets(*args)
@input.gets(*args)
end
def puts(*args)
@output.puts(*args)
end
def initialize
@input = $stdin
@output = $stdout
end
private
def first_method
input = gets.chomp
if input == "test"
second_method(input)
end
end
def second_method(value)
puts value
second_method(value)
end
end
Да, это надуманное, но это упрощение мысли, что вы можете иметь метод, который вы не хотите, названные в тесте.
Так что я мог бы написать тест, такие как:
setup do
@project = Red.new
@project.instance_variable_set(:@input, StringIO.new("test\n"))
@project.stubs(:second_method)
end
should "pass input value to second_method" do
@project.expects(:second_method).with("test").once
@project.instance_eval {first_method}
end
Теперь я ожидаю, что это пройдет. Но вместо этого я получаю сообщение об ошибке, а аркан:
Errno::ENOENT: No such file or directory - getcwd
/Users/i0n/.rvm/gems/ruby-1.9.2-head/gems/mocha-0.9.8/lib/mocha/backtrace_filter.rb:12:in `expand_path'
/Users/i0n/.rvm/gems/ruby-1.9.2-head/gems/mocha-0.9.8/lib/mocha/backtrace_filter.rb:12:in `block in filtered'
/Users/i0n/.rvm/gems/ruby-1.9.2-head/gems/mocha-0.9.8/lib/mocha/backtrace_filter.rb:12:in `reject'
/Users/i0n/.rvm/gems/ruby-1.9.2-head/gems/mocha-0.9.8/lib/mocha/backtrace_filter.rb:12:in `filtered'
/Users/i0n/.rvm/gems/ruby-1.9.2-head/gems/mocha-0.9.8/lib/mocha/expectation_error.rb:10:in `initialize'
/Users/i0n/.rvm/gems/ruby-1.9.2-head/gems/mocha-0.9.8/lib/mocha/mockery.rb:53:in `new'
/Users/i0n/.rvm/gems/ruby-1.9.2-head/gems/mocha-0.9.8/lib/mocha/mockery.rb:53:in `verify'
/Users/i0n/.rvm/gems/ruby-1.9.2-head/gems/mocha-0.9.8/lib/mocha/api.rb:156:in `mocha_verify'
/Users/i0n/.rvm/gems/ruby-1.9.2-head/gems/mocha-0.9.8/lib/mocha/integration/mini_test/version_131_and_above.rb:27:in `run'
Это абсолютно ничего не значит для меня, кроме чего-то глубоко в недрах мокко только пошла лязг. Если я пишу один и тот же тест, не передавая аргумент второму методу, я не получу никаких проблем. Я что-то упускаю?