2013-12-13 10 views
7

Próbuję przetestować kontroler, który odbiera koryta routera obiektu determinację:angularjs: atrapa obiektu wtryskiwany do kontrolera determinację koryta routera

app.js:

... 
.when('/confirm', { 
    templateUrl: 'views/confirm.html', 
    controller: 'ConfirmCtrl', 
    resolve: { 
    order: function(Order) { 
     return Order.current; 
    } 
    } 
}) 
... 

ConfirmCtrl.js:

angular.module('angularGeolocationApp').controller('ConfirmCtrl', 
function($scope, order, ...) { 

    $scope.order = order 

    ... 

}); 

Mój test wygląda następująco:

'use strict'; 

describe('Controller: ConfirmCtrl', function() { 

    // load the controller's module 
    beforeEach(module('angularGeolocationApp')); 

    var ConfirmCtrl, 
    scope; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope) { 
    scope = $rootScope.$new(); 
    ConfirmCtrl = $controller('ConfirmCtrl', { 
     $scope: scope 
    }); 
    })); 

    it('should get an order object', function() { 
    expect(_.isObject(scope.order)).toBeTruthy(); 
    }); 

    ... 
}); 

Jednak najpierw oczekiwanie nie:

PhantomJS 1.9.2 (Mac OS X) Controller: ConfirmCtrl should get an order object FAILED 
    TypeError: Attempted to assign to readonly property. 
     at workFn (/Users/jviotti/Projects/Temporal/angular/angular-geolocation/app/bower_components/angular-mocks/angular-mocks.js:2107) 
    Expected false to be truthy. 

Moje założenie jest, że jak jestem jednostka badania samodzielnie kontroler, router nie ma zmiany, aby uruchomić funkcję resolve i przypisać odpowiednią wartość.

Czy istnieje sposób na wyśmiewanie tego uzależnienia od order?

wiem, że mogę pozbyć się rzeczy resolve i wstrzyknąć Order i wystąpienia $scope.order do Order.current w samym kontrolerze, ale chciałbym zachować podejście resolve.

Odpowiedz

13

Po prostu włóż własne zamówienie do konstruktora ctrl w ten sposób.

describe('Controller: ConfirmCtrl', function() { 

    // load the controller's module 
    beforeEach(module('angularGeolocationApp')); 

    var ConfirmCtrl, 
     scope, 
     order 


    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope) { 
    order = {}; 
    scope = $rootScope.$new(); 
    ConfirmCtrl = $controller('ConfirmCtrl', { 
     $scope: scope, 
     order: order 
    }); 
    })); 

    it('should get an order object', function() { 
    expect(_.isObject(scope.order)).toBeTruthy(); 
    }); 

    ... 
}); 

pozdrowienia

+0

Co jeśli po kilku testach, chcę zmienić wartość 'order'. Jak mogę to zrobić? –

Powiązane problemy