2012-11-09 9 views
7

Uwaga: Piszę wszystko coffeescript

Mam kontroler następująco:

angular.module('myApp').controller 'MyController', ($scope, $routeParams, Batch) -> 
    $scope.$on '$routeChangeSuccess',() -> 
     Batch.get {batchUuid: $routeParams.batchUuid}, (response) -> 
      $scope.batch_id = response.id 

Kontroler ciągnie w zasobie partii, która jest zdefiniowane następująco:

angular.module('myApp').factory 'Batch', ($resource) -> 
    $resource '/batches/:batchUuid', {} 

mam trasę do tego, co następuje:

$routeProvider.when('/batches/:batchUuid', 
    { templateUrl: 'batches-processing.html', controller: 'MyController' }) 

Więc:

  • odwiedzić trasę /partie/22
  • Wykorzystuje MyController
  • To wyzwala $ routeChangeSuccess
  • wywołuje ona dostać się na czarownicę zasobów Batch the batchUuid from the route
  • To z powrotem odpowiedź json i assi GNS id do $ scope.batch_id

Teraz chcę przetestować więc mam badanej jednostki następująco:

describe 'Controllers', -> 
    beforeEach module 'myApp' 
     describe 'MyController', -> 
      scope = {} 
      ctrl= {} 

      beforeEach inject ($rootScope, $controller, Batch, $httpBackend) -> 
       scope = $rootScope.$new() 
       ctrl = $controller('MyController', ($scope: scope)) 
       #I imagine I need to use either my injected Batch resource or the httpBackend to fake/expect the ajax call here 

      it "Gets data from the resource and assigns it to scope",() -> 
       #How on earth do I test this 

Widziałem ludzi używających $ httpBackend.expect ('/ końcowy. json '). reply ({id: 1}) itp., ale nie mogę tego zrobić. Mój adres URL zasobu opiera się na batchUuid z trasy. Jak mogę zasymulować/sfałszować/wdrożyć test symulujący zmianę trasy, aktywować $ routeChangeSuccess, przekazać routeParameter do zasobu, uzyskać dostęp do zasobu i przetestować wynik?

Wyciągam włosy z tego, a kanciaste dokumenty nie wydają się tego ukrywać.

Dzięki!

Odpowiedz

10

Można wykonać fałszywą trasęParams i wprowadzić ją do kontrolera.

Używam creatSpy jasmine dla moich podróbek, ale to może być trochę przesada. Jest przykład here, który pokazuje, jak stworzyć i wstrzyknąć fałszywą drogęParams.

+0

Legendary kolego. Po prostu legendarny. –

+1

minus jeden za coffeescript? gwizd. Pytanie samo w coffeescript –

0

Ten js skrzypce pokazuje routeParams jest wstrzykiwany:

http://jsfiddle.net/rimian/wgctykea/

it('should take articleId as id if specified', inject(function ($controller) { 
    routeParams.articleId = 5; 

    ctrl = $controller('MyAppCtrl', { 
    $scope: scope, 
    $routeParams: routeParams 
    }); 

    expect(scope.id).toEqual(5); 
})); 
+0

działa również z obiektem $ filter? –

Powiązane problemy