2012-05-27 14 views
5

Así que soy nuevo en todo lo relacionado con las pruebas (he sido una de esas personas que ha dicho 'Debería escribir pruebas unitarias ...' pero nunca terminé haciéndolo: - pag). Ahora estoy escribiendo pruebas unitarias para este proyecto. Estoy usando testacular + jazmín, con browserify para compilar cosas. No tuve problemas hasta que comencé a tratar de hacer muchas cosas de inyección AngularJS.AngularJS - pruebas básicas con inyección

Ahora mismo simplemente estoy tratando de hacer una prueba de ng-model para entenderlo.

tengo un archivo testacular.conf que incluye todo lo necesario:

files = [ 
    '../lib/jquery.js', 
    '../lib/angular.js', 
    './lib/jasmine.js', 
    './lib/angular-mocks.js', 
    JASMINE_ADAPTER, 
    './tests.js' //compiled by browserify 
]; 

he definido mi controlador (MainCtrl.coffee)

MainCtrl = ($scope, $rootScope) -> 
    $scope.hello = 'initial' 

module.exports = (angularModule) -> 
    angularModule.controller 'MainCtrl', ['$scope', '$rootScope', MainCtrl] 
    return MainCtrl 

y tengo mi propia prueba: (_MainCtrlTest. café, en el mismo directorio que MainCtrl.coffee)

testModule = angular.module 'MainCtrlTest', [] 
MainCtrl = require('./MainCtrl')(testModule) 

describe 'MainCtrlTest', -> 
    scope = null 
    elm = null 
    ctrl = null 

    beforeEach inject ($rootScope, $compile, $controller) -> 
     scope = $rootScope.$new() 
     ctrl = $controller MainCtrl, $scope: scope 
     elm = $compile('<input ng-model="hello"/>')(scope) 

    describe 'value $scope.hello', -> 

     it 'should initially equal input value', -> 
      expect(elm.val()).toBe scope.hello 

     it 'should change when input value changes', -> 
      scope.$apply -> elm.val('changedValue') 
      expect(scope.hello).toBe elm.val() 

La prueba falla inmediatamente, con el pulgar ut's elm.val() que vuelve en blanco, y scope.hello que devuelve el valor previsto ('initial', establecido en MainCtrl.coffee)

¿Qué estoy haciendo mal aquí?

Respuesta

10

Para conseguir este trabajo, que tiene que hacer scope.$apply():

it 'should initially equal input value', -> 
    scope.$apply() 
    expect(elm.val()).toBe scope.hello 

No pruebe el marco, probar su código

Su prueba está tratando de probar si angular de la unión, y ng-model trabajos. En su lugar, debería confiar en el marco y probar su código.

Su código es:

  1. el controlador (ajuste inicial scope.hello valor)
  2. plantillas HTML (y todos los vinculantes, directivas de allí)

Puede probar la primera de ellas muy fácilmente, sin tocar ningún DOM. Esa es la belleza de AngularJS: una fuerte separación de la vista/lógica.

En este controlador, no hay casi nada que probar, pero el valor inicial:

it 'should init hello', -> 
    expect(scope.hello).toBe 'initial' 

Para probar la segunda (+ plantilla de unión), que desea hacer una prueba de E2E. Básicamente, quieres probar, si la plantilla no contiene ningún error tipográfico en el enlace, etc. ... Entonces quieres probar la plantilla real. Si alinea un html diferente durante la prueba, no está probando nada más que AngularJS.

+0

Gracias Vojta. Funciona ahora :-) Sí, solo estaba tratando de hacer una prueba angular básica para entender cómo hacer la inyección y la instancia del controlador dentro de una prueba. Todo es realmente simple, lo cual es genial. –

Cuestiones relacionadas