2012-11-09 32 views
7

Lưu ý: Tôi đang viết tất cả mọi thứ trong CoffeeScript

Tôi có một bộ điều khiển như sau:

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

Bộ điều khiển kéo trong nguồn hàng loạt mà là quy định như sau:

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

tôi có một lộ trình cho việc này như sau:

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

Vì vậy:

  • Quý khách tham quan các tuyến đường /lô/22
  • Nó sử dụng MyController
  • Nó gây nên $ routeChangeSuccess
  • Nó kêu gọi được trên phù thủy tài nguyên hàng loạt batchUuid từ tuyến đường
  • Nó được trả về một phản ứng json và assi GNS một id đến $ scope.batch_id

Bây giờ tôi muốn kiểm tra điều này vì vậy tôi có một bài kiểm tra đơn vị như sau:

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 

Tôi đã thấy những người sử dụng $ httpBackend.expect ('/ endpoint. json '). trả lời ({id: 1}) vv nhưng tôi không thể làm điều đó. URL tài nguyên của tôi dựa trên batchUuid từ tuyến đường. Làm thế nào tôi có thể mô phỏng/giả/thực hiện một thử nghiệm mà sẽ mô phỏng một sự thay đổi tuyến đường, kích hoạt $ routeChangeSuccess, vượt qua một routeParameter đến tài nguyên, làm một nhận được trên tài nguyên và kiểm tra kết quả?

Tôi đang kéo tóc ra khỏi tài liệu này và góc cạnh dường như không bao gồm nó.

Cảm ơn!

Trả lời

10

Bạn có thể tạo một tuyến giả mạoParams và đưa nó vào bộ điều khiển của bạn.

Tôi sử dụng createSpy của hoa nhài cho hàng giả, nhưng điều đó có thể hơi quá mức. Có một ví dụ here cho thấy cách tạo và tiêm routeParams giả.

+0

huyền thoại người bạn đời. Chỉ là huyền thoại. –

+1

trừ một cho coffeescript? boo. Bản thân câu hỏi nằm trong coffeescript –

0

này js fiddle lãm routeParams được tiêm:

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

điều này có hoạt động với đối tượng lọc $ không? –

Các vấn đề liên quan