2010-06-25 13 views
16

He estado siguiendo la guía 15 TDD steps to create a Rails application, pero me he encontrado con un problema que no puedo resolver. Para la prueba funcional de la WordsController, tengo el siguiente código:Mocha Mock lleva a otra prueba

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 

En la clase Palabra Tengo el siguiente código:

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

Cuando ejecuto las pruebas, experimento el siguiente error (acortado por razones de brevedad):

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

he intentado cambiar cambiando el orden de las pruebas, junto con una multitud de otras cosas, pero una y otra vez que continúan recibiendo los mismos tes t error: Word.random() ya se ha invocado.

Estoy ejecutando Rails 3.0 beta 4 y Mocha 0.9.8. He buscado mucho y mucho para encontrar una solución a mi problema, pero parece que no puedo encontrarlo. Soy nuevo en Ruby/Rails, así que no estoy familiarizado con el lenguaje y los frameworks.

¡Gracias de antemano!

Respuesta

7

Tuve el mismo problema, la funcionalidad burlada no estaba aislada de una prueba, parece ser un problema con el orden de carga de Mocha.

Tuve algunos problemas para que Mocha trabaje con Rails3. He encontrado algunos puestos stackoverflow respecto, pero no tropiezo a través de la solución hasta que encontré un post en agoragames.com

Básicamente, en el Gemfile de su proyecto, la requerirá para Mocha debe verse como:

gem 'mocha', :require => false 

Luego, en test/test_helper.rb, agregue una línea para requerir moka:

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

class ActiveSupport::TestCase 
... 
... 

creo que la línea de moka en el Gemfile requiere significa que usted necesita tener instalado ya moka como una joya, bundler no se hará cargo de eso para ti.

2

¿Cómo se requiere mocha? ¿Estás usando bundler? Suena un poco como si el gancho de desmontaje de mocha no se llamara?

+0

¿Se supone que se debe llamar al desmontaje entre pruebas? – pushmatrix

+1

Si 'Mocha' se ha cargado correctamente, habrá parcheado el marco de prueba para llamar a' Mocha :: API # mocha_verify' y 'Mocha :: API # mocha_teardown', es decir, no debería necesitar llamarlos explícitamente. La razón por la que estaba preguntando cómo se requería 'Mocha' era para determinar si las cosas se están cargando en el orden correcto, para que el parche de monos funcione correctamente. –

+1

Si configura 'MOCHA_OPTIONS = debug' como una variable de entorno cuando ejecuta las pruebas, verá qué frameworks de pruebas están siendo parcheados con éxito. Si todavía tiene problemas con esto, dígame cuál es la salida de depuración y dígame qué versión de Mocha está utilizando. Gracias. –

19

mocha se debe cargar al último. Luché mucho con este problema también.

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

y

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

Exactamente lo que necesitaba ... – pushmatrix

+0

Exactamente lo que necesitaba también. ¡Me estaba arrancando el pelo con esto por horas! ¡Gracias! :) –

+0

+1, con la migración al bundler en orden de mocha loading –

0

Además, parece mocha_teardown no se está llamando con rails31. Mocks que se configuran Nunca se retiran ... (este truco adicional lo fija)

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

Esas soluciones no funcionaron para mí por su cuenta, utilizando Rubí 2.2.2, 4.2.2 Carriles, moka 1.1. 0, shoulda-context 1.2.1, factory_girl_rails 4.5.0 y algunas gemas más relacionadas con las pruebas.

Lo que hizo fue también mover estas dos líneas en la parte inferior de mi test_helper.rb:

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

que también se elimina require 'test/unit'. Parece que mocha/test_unit ya lo hace por mí.

Cuestiones relacionadas