2009-11-04 10 views
5

Estoy usando TestUnit y me gustaría determinar si se llama a una función. Tengo un método en una clase Persona llamada, la cual di a llamarse 'before_update':Pruebe si se llama a una función en una prueba de la unidad Ruby on Rails

def geocode_if_location_info_changed 
    if location_info_changed? 
     spawn do 
     res = geocode 
     end 
    end 
    end 

entonces tengo una prueba de unidad:

def test_geocode_if_location_info_changed 
    p = create_test_person 
    p.address = "11974 Thurloe Drive" 
    p.city = "Baltimore" 
    p.region = Region.find_by_name("Maryland") 
    p.zip_code = "21093" 
    lat1 = p.lat 
    lng1 = p.lng 

    # this should invoke the active record hook 
    # after_update :geocode_if_location_info_changed 
    p.save 
    lat2 = p.lat 
    lng2 = p.lng 
    assert_not_nil lat2 
    assert_not_nil lng2 
    assert lat1 != lat2 
    assert lng1 != lng2 

    p.address = "4533 Falls Road" 
    p.city = "Baltimore" 
    p.region = Region.find_by_name("Maryland") 
    p.zip_code = "21209" 

    # this should invoke the active record hook 
    # after_update :geocode_if_location_info_changed 
    p.save 

    lat3 = p.lat 
    lng3 = p.lng 
    assert_not_nil lat3 
    assert_not_nil lng3 
    assert lat2 != lat3 
    assert lng2 != lng3 
end 

¿Cómo puedo estar seguro de que el método de "codificación geográfica" fue llamado? Esto es más importante para el caso en que deseo asegurarme de que no se llame si la información de ubicación no ha cambiado.

Gracias!

Respuesta

6

Usar mocha. Esto prueba la lógica de su filtro:

def test_spawn_if_loc_changed 
    // set up omitted 
    p.save! 
    p.loc = new_value 
    p.expects(:spawn).times(1) 
    p.save! 
end 

def test_no_spawn_if_no_data_changed 
    // set up omitted 
    p.save! 
    p.other_attribute = new_value 
    p.expects(:spawn).times(0) 
    p.save! 
end 
+0

Estoy de acuerdo con esta respuesta, aunque creo que quiere 'p.expects (: geocode_if_location_info_changed) .times (1)'. Estoy bien con el uso de mocha aquí. Un filtro anterior parece bastante cercano a un colaborador, en mi opinión. –

+0

Estaba tratando de probar la lógica del filtro anterior, y * spawn * es lo primero dentro del if. Si solo prueba la llamada del filtro anterior, solo está probando que el "before_filter" estaba presente y que los rieles están funcionando ... eso está bien, pero parece que estamos tratando de entender la lógica dentro del filtro. – ndp

+0

Buen punto: puedo ver ese ángulo. –

1

Lo que necesita son objetos simulados (consulte Mockobjects y Mocks aren't stubs para obtener información más general). RSpec tiene support for them, y hay otras bibliotecas autónomas (por ejemplo, Mocha), que deberían ayudarle si no necesita cambiar a RSpec.

+0

¿Qué debo simular aquí? Mi objeto personal es el sistema bajo prueba y de acuerdo con el artículo de Martin Fowler, los simulacros deben usarse para los colaboradores. – Tony

Cuestiones relacionadas