Подтвердить что ты не робот

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, поэтому я не знаком с языком и фреймворками.

Спасибо заранее!

4b9b3361

Ответ 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 уже делает это для меня.