2013-08-27 111 views
5

Tôi có các xét nghiệm đơn vị sau đây, và vì lý do nào đó, kiểm tra thứ hai làm cho các thử nghiệm khác thất bại.AngularJS Jasmine Unit Tests

beforeEach(inject(function ($rootScope, _$httpBackend_, $controller, $location, mockedResource) { 
    scope = $rootScope.$new(); 
    httpBackend = _$httpBackend_; 
    locationService = $location; 

    ctrlDependencies = { 
     $scope: scope, 
     resource: mockedResource, 
    } 

    var ctrl = $controller('myController', ctrlDependencies); 
})); 

it('should redirect to a new page', function() { 
    scope.pageRedirectFunction(); 
    expect(locationService.path()).toBe('/newpage') 
}); 

it('should delete an epic resource', function() { 
    httpBackend.expectGET('/api/v1/epic/1').respond({}); 
    httpBackend.expectDELETE('/api/v1/epic/1').respond({}); 

    // Run the deletion function 
    scope.deleteEpicResource() 

    httpBackend.flush() // This line seems to be the rebelious one 

    expect(scope.epicResources.length).toEqual(0) 
}) 

Tôi đã tìm ra đường có vẻ như gây ra lỗi và đó là dòng httpBackend.flush(). Tại sao chức năng tuôn ra gây ra hành vi lạ?

Các lỗi thực tế tôi nhận được từ cách chạy lệnh karma start tại nhà ga, là:

Delaying execution, these browsers are not ready: Chrome 29.0 .... 

sau một thời gian ngắn, các phiên Chrome sau đó bị treo.

+0

Bạn đã nhận được lỗi nào? Không có điều đó, không ai có thể đoán được. – zsong

+0

Tất nhiên! Thật là một sai lầm khủng khiếp. Đang cập nhật lỗi bây giờ ... – Sneaksta

+0

Cố gắng tăng mức nhật ký của Karma để gỡ lỗi, để xem điều gì xảy ra. – madhead

Trả lời

2

Một mẹo ít người biết về thử nghiệm/yêu cầu chế giễu async với hoa nhài và AngularJS:

Nếu bạn không gọi một cách rõ ràng theo yêu cầu ở bạn thử nghiệm (tức là gọi đó là thông qua chức năng khác), yêu cầu sẽ không được tiêu hóa bởi kiễu góc, vì vậy nó làm cho nó có vẻ như nếu yêu cầu không bao giờ bị sa thải (khi bạn gọi flush())

Thử chạy scope.$digest() trước httpBackend.flush() cuộc gọi của bạn, mà có thể làm các trick. Xem this thread để biết thêm thông tin.

+0

Tôi đã khắc phục điều này một lúc, nhưng không nhớ cách tôi đã sửa nó. Sau khi đọc câu trả lời của bạn, tôi nhận ra rằng tôi đã không gọi tuôn ra() cho tất cả các yêu cầu tôi cần. Điều này chủ yếu là một vấn đề vì có các yêu cầu API được tải ngay sau khi bộ điều khiển của tôi được tải, nhưng tôi đã quên chúng. – Sneaksta

+0

Việc thêm $ digest() có giải quyết được mối lo ngại về sự cố Chrome không? – kfitzpatrick

0

Bạn có bao gồm angular-mocks.js trước khi thử nghiệm không? Ngoài ra, bạn có thể muốn thử để tải ngMocks mô-đun:

beforeEach(module("ngMock"));