2010-06-25 17 views
16

J'ai suivi le guide 15 TDD steps to create a Rails application - mais j'ai rencontré un problème que je n'arrive pas à résoudre. Pour le test fonctionnel du WordsController, je le code suivant:Mock Mock porte à un autre test

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 

Dans la classe mot que j'ai le code suivant:

class Word < ActiveRecord::Base 
    def self.random 
    all = Word.find :all 
    all[rand(all.size)] 
    end 
end 

Quand je lance les essais, je fais l'expérience l'erreur suivante (raccourcies par souci de concision):

1) Failure: unexpected invocation: Word(...).random() satisfied expectations: 
- expected exactly once, already invoked once: Word(...).random() 

J'ai essayé de changer de changer l'ordre des essais avec une multitude d'autres choses, mais maintes et maintes fois je continue de recevoir les mêmes tes t échec - que Word.random() a déjà été appelé. Je cours Rails 3.0 beta 4 et Mocha 0.9.8. J'ai cherché longtemps et dur pour une solution à mon problème, mais je n'arrive pas à le trouver. Je suis nouveau à Ruby/Rails donc je ne suis pas familier avec la langue et les frameworks.

Merci d'avance!

Répondre

7

J'ai eu le même problème, la fonctionnalité moqueuse n'a pas été isolée à un test, il semble y avoir un problème avec l'ordre de chargement de Mocha.

J'ai rencontré des problèmes pour faire fonctionner Mocha avec Rails3. J'ai trouvé quelques messages stackoverflow concernant, mais ne trébuche sur la solution jusqu'à ce que je trouve un post sur agoragames.com

En fait, dans le Gemfile de votre projet, le besoin pour Mocha devrait ressembler à:

gem 'mocha', :require => false 

Puis, en test/test_helper.rb, ajoutez une ligne require pour mocha:

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

class ActiveSupport::TestCase 
... 
... 

Je pense que la ligne require pour mocha dans le Gemfile signifie que vous devez avoir déjà installé mocha comme une pierre précieuse, Bundler ne prendra pas soin de cela pour vous.

2

Comment voulez-vous du moka? Utilisez-vous bundler? Cela semble un peu comme si le crochet de démontage de moka n'est pas appelé?

+0

Le démontage est-il censé être appelé entre les tests? – pushmatrix

+1

Si 'Mocha' a été chargé correctement, il aura un framework de test modifié par singe pour appeler' Mocha :: API # mocha_verify' & 'Mocha :: API # mocha_teardown', c'est-à-dire que vous ne devriez pas avoir besoin de les appeler explicitement. La raison pour laquelle je demandais comment 'Mocha' était requis, était de savoir si les choses étaient chargées dans le bon ordre, de sorte que le patch de singe fonctionne correctement. –

+1

Si vous définissez 'MOCHA_OPTIONS = debug' comme variable d'environnement lorsque vous exécutez vos tests, vous verrez quels frameworks de test sont corrigés avec succès. Si vous avez encore des problèmes avec ceci, laissez-moi savoir quelle est la sortie de débogage et dites-moi quelle version de Moka vous utilisez. Merci. –

19

mocha doit être chargé en dernier. J'ai beaucoup lutté avec ce problème aussi.

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

et

test_helper.rb 
    .... 
    #at the very bottom 
    require 'mocha' 
+1

Exactement ce dont j'avais besoin ... – pushmatrix

+0

Exactement ce dont j'avais besoin aussi. Je me suis arraché les cheveux avec ça pendant des heures! Merci! :) –

+0

+1, avec migration vers bundler i'v messed ordre de chargement de moka –

0

De plus, il semble mocha_teardown est pas appelé avec rails31. Simulacres qui sont la configuration ne sont jamais supprimés ... (ce hack supplémentaire le fixe)

class ActiveSupport::TestCase 
    def teardown 
     super 
     Mocha::Mockery.instance.teardown 
     Mocha::Mockery.reset_instance  
    end 
    end 
0

Ces solutions ne fonctionnent pas pour moi de leur propre chef, en utilisant Ruby 2.2.2, Rails 4.2.2, 1.1 mocha. 0, shoulda-context 1.2.1, factory_girl_rails 4.5.0 et quelques gemmes liées aux tests.

Qu'est-ce que c'était aussi déplacer ces deux lignes au bas de mon test_helper.rb:

require 'mocha/setup' 
require 'mocha/test_unit' 

J'ai aussi retiré require 'test/unit'. Il semble que mocha/test_unit le fait déjà pour moi.