Mocha Mock переносит на другой тест
Я следил за 15 шагов TDD для создания руководства Rails - но столкнулись с проблемой, которую я не могу решить. Для функционального теста WordsController у меня есть следующий код:
class WordsControllerTest < ActionController::TestCase
test "should get learn" do
get 'learn'
assert_response :success
end
test "learn passes a random word" do
some_word = Word.new
Word.expects(:random).returns(some_word)
get 'learn'
assert_equal some_word, assigns('word')
end
end
В классе Word у меня есть следующий код:
class Word < ActiveRecord::Base
def self.random
all = Word.find :all
all[rand(all.size)]
end
end
Когда я запускаю тесты, я испытываю следующую ошибку (сокращенную для краткости):
1) Failure: unexpected invocation: Word(...).random() satisfied expectations:
- expected exactly once, already invoked once: Word(...).random()
Я попытался изменить изменение порядка тестов вместе с множеством других вещей, но снова и снова я продолжаю получать тот же самый сбой теста - что Word.random() уже был вызван.
Я запускаю Rails 3.0 beta 4 и Mocha 0.9.8. Я долго искал решение моей проблемы, но, похоже, я не могу ее найти. Я новичок в Ruby/Rails, поэтому я не знаком с языком и фреймворками.
Спасибо заранее!
Ответы
Ответ 1
У меня была та же проблема, издевательская функциональность не была изолирована от теста, это, похоже, проблема с порядком загрузки Mocha.
У меня были некоторые проблемы с Mocha для работы с Rails3. Я нашел несколько сообщений stackoverflow, но не наткнулся на решение, пока не нашел сообщение на agoragames.com
В основном, в Gemfile вашего проекта требование для Mocha должно выглядеть так:
gem 'mocha', :require => false
Затем в test/test_helper.rb
добавьте строку require для mocha:
...
...
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'mocha'
class ActiveSupport::TestCase
...
...
Я думаю, что линия для мокко в Gemfile требует означает, что вам нужно уже мокко установлены как драгоценный камень, пакетирования не будет заботиться о нем для вас.
Ответ 2
mocha необходимо загрузить последним. Я тоже много боролся с этой проблемой.
#Gemfile
group :test
gem 'mocha', '~>0.9.8', :require => false
...
end
и
test_helper.rb
....
#at the very bottom
require 'mocha'
Ответ 3
Как вам нужно мокко? Вы используете пакет? Это звучит немного, как если бы не был вызван крючок отморозки мокко?
Ответ 4
Кроме того, кажется, что mocha_teardown не вызывается с rails31. Mocks, которые устанавливаются, никогда не удаляются... (этот дополнительный хак исправляет его)
class ActiveSupport::TestCase
def teardown
super
Mocha::Mockery.instance.teardown
Mocha::Mockery.reset_instance
end
end
Ответ 5
Эти решения не работали для меня самостоятельно, используя Ruby 2.2.2, Rails 4.2.2, mocha 1.1.0, shoulda-context 1.2.1, factory_girl_rails 4.5.0 и еще несколько тестов, связанных с тестированием.
Что было также, перемещая эти две строки в нижней части моего test_helper.rb
:
require 'mocha/setup'
require 'mocha/test_unit'
Я также удалил require 'test/unit'
. Похоже, что mocha/test_unit
уже делает это для меня.