Mocha Mock переносит в другое испытание - PullRequest
16 голосов
/ 25 июня 2010

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

Заранее спасибо!

Ответы [ 5 ]

20 голосов
/ 07 декабря 2010

Мокко должно быть загружено последним. Я тоже много боролся с этой проблемой.

#Gemfile
  group :test
    gem 'mocha', '~>0.9.8', :require => false
    ...
  end

и

test_helper.rb
  ....
  #at the very bottom
  require 'mocha'
7 голосов
/ 03 декабря 2010

У меня была такая же проблема, проверенная функциональность не была изолирована от теста, похоже, проблема с порядком загрузки Mocha.

У меня были некоторые проблемы с получением Mocha для работы с Rails3.Я нашел несколько сообщений от stackoverflow, но не наткнулся на решение, пока не нашел пост на agoragames.com

По сути, в Gemfile вашего проекта требование для Mocha должно выглядеть следующим образом:

gem 'mocha', :require => false

Затем в test/test_helper.rb добавьте строку требуемого для mocha:

...
...
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'mocha'

class ActiveSupport::TestCase
...
...

Я думаю, что строка require для mocha в Gemfile означает, что вам нужно уже установить mocha какжемчужина, упаковщик не позаботится об этом за тебя.

2 голосов
/ 28 сентября 2010

Как вы требуете мокко? Вы используете упаковщик? Звучит так, как будто не вызывается крюк для разрыва мокко?

0 голосов
/ 10 октября 2015

Эти решения не работали для меня сами по себе, используя Ruby 2.2.2, Rails 4.2.2, mocha 1.1.0, musta-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 уже делает это для меня.

0 голосов
/ 19 сентября 2011

Кроме того, похоже, что mocha_teardown не вызывается с rails31. Установленные насмешки никогда не удаляются ... (этот дополнительный взлом исправляет это)

  class ActiveSupport::TestCase
    def teardown
      super
      Mocha::Mockery.instance.teardown
      Mocha::Mockery.reset_instance    
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...