2013-03-26 24 views
13

Tôi cần ứng dụng của mình chạy một số cấu hình tại thời điểm chạy vi điểm cuối HTTP.Kiểm tra đơn vị khi tải mọi thứ khi chạy ứng dụng với AngularJS

Tôi đã viết một dịch vụ đơn giản để làm điều đó:

module.factory('config', function ($http, analytics) { 
    return { 
     load: function() { 
      $http.get('/config').then(function (response) { 
       analytics.setAccount(response.googleAnalyticsAccount); 
      }); 
     } 
    } 
}); 

Tiếp theo, tôi gọi module này trong một khối chạy của module ứng dụng của tôi:

angular.module('app').***.run(function(config) { 
     config.load(); 
    }); 

Tất cả đang làm việc tốt khi ứng dụng chạy nhưng trong các bài kiểm tra đơn vị của tôi, tôi nhận được lỗi này: "Lỗi: Yêu cầu bất ngờ: GET/config"

Tôi biết điều đó có nghĩa là gì nhưng tôi không biết làm thế nào để giả lập nó khi nó xảy ra từ khối chạy.

Nhờ sự giúp đỡ của bạn

EDIT để thêm đặc tả

Calling này trước mỗi

beforeEach(angular.mock.module('app')); 

Cố gắng này để chế nhạo $ httpBackend:

beforeEach(inject(function($httpBackend) { 

    $httpBackend.expectGET('/config').respond(200, {'googleAnalyticsAccount':}); 

    angular.mock.module('app') 

    $httpBackend.flush(); 
})); 

Nhưng có:

TypeError: Cannot read property 'stack' of null 
     at workFn (/Users/arnaud/workspace/unishared-dredit/test/lib/angular/angular-mocks.js:1756:55) 
    TypeError: Cannot read property 'stack' of null 
     at workFn (/Users/arnaud/workspace/unishared-dredit/test/lib/angular/angular-mocks.js:1756:55) 
    TypeError: Cannot read property 'stack' of null 
     at workFn (/Users/arnaud/workspace/unishared-dredit/test/lib/angular/angular-mocks.js:1756:55) 

EDIT kể từ khi cập nhật cho AngularJS 1.0.6

Kể từ khi tôi đã cập nhật lên AngularJS 1.0.6, tư vấn bởi Igor từ nhóm kiễu góc, vấn đề này đã biến mất nhưng bây giờ bây giờ tôi đã có cái này, nghe có vẻ "bình thường" hơn nhưng tôi vẫn không thể tìm ra cách để nó hoạt động.

Error: Injector already created, can not register a module! 
+2

Tôi cũng gặp lỗi này khi thử nghiệm 'run()' – halfcube

+0

Cuối cùng tôi đã di chuyển nó trong bộ điều khiển gốc Ứng dụng của mình để làm cho nó có thể kiểm chứng được. –

Trả lời

16

Tôi đã gặp khó khăn với lỗi này trong một thời gian ngắn, nhưng đã cố gắng tìm ra giải pháp hợp lý.

Điều tôi muốn đạt được là tạo thành công Dịch vụ và buộc phản hồi, trên bộ điều khiển có thể sử dụng $httpBackend với yêu cầu hoặc ngoại lệ trước khi khởi động bộ điều khiển. Trong app.run() khi bạn tải module nó khởi tạo đối tượng và Dịch vụ được kết nối, v.v.

Tôi đã quản lý để cung cấp Dịch vụ bằng ví dụ sau.

describe('Testing App Run', function() { 
    beforeEach(module('plunker', function ($provide) { 
     return $provide.decorator('config', function() { 
      return { 
       load: function() { 
        return {}; 
       } 
      }; 
     }); 
    })); 


    var $rootScope; 
    beforeEach(inject(function (_$rootScope_) { 
     return $rootScope = _$rootScope_; 
    })); 

    it("defines a value I previously could not test", function() { 
     return expect($rootScope.value).toEqual('testing'); 
    }); 

}); 

Tôi hy vọng điều này sẽ giúp kiểm tra app.run() của bạn trong tương lai.

+0

Xin lưu ý trang trí 'config' không đề cập đến giai đoạn cấu hình của góc cạnh, nhưng đối với dịch vụ nhà máy OP có tên 'config' – ErikAGriffin

+0

Điều này được viết khoảng thời gian của Angular 1.0.5 để API có thể đã thay đổi một chút kể từ đó. – halfcube

1

Bạn nên thử mọi yêu cầu HTTP với ngMock.$httpBackend. Ngoài ra, here is a guide.


Cập nhật

Bạn không cần phải điều angular.mock.module, chỉ cần tiêm mô-đun ứng dụng của bạn. Một cái gì đó như thế này:

var httpBackend; 

beforeEach(module('app')); 
beforeEach(inject(function($httpBackend) { 
    httpBackend = $httpBackend; 
    $httpBackend.expectGET('/config').respond(200, {'googleAnalyticsAccount': 'something'}); 
})); 

Trong thử nghiệm của bạn, khi bạn cần http mô phỏng trả lời, bạn sẽ gọi httpBackend.flush(). Đây là lý do tại sao chúng tôi có một tham chiếu đến nó, vì vậy bạn không cần phải tiêm nó trong mỗi thử nghiệm duy nhất mà bạn có.

Lưu ý rằng bạn sẽ cần tải angular-mock.js để nó hoạt động.

+0

Cảm ơn câu trả lời của bạn. Nếu tôi làm bất kỳ tiêm trước khi gọi angular.mock.module tôi nhận được một lỗi nói rằng Injector đã được tạo ra –

+0

Đăng các thông số kỹ thuật có liên quan, xin vui lòng. –

+0

Chỉ cần đăng, cảm ơn sự giúp đỡ của bạn! –

5

Tôi không biết liệu bạn có đang tìm câu trả lời cho câu hỏi này hay không. Nhưng đây là một số thông tin có thể hữu ích.

$ kim phun là một đơn cho một ứng dụng chứ không phải cho một mô-đun. Tuy nhiên, angular.injector sẽ thực sự cố gắng để tạo ra một vòi phun mới cho mỗi mô-đun (tôi giả sử bạn có một

beforeEach(module("app")); 

lúc đầu.

tôi đã cùng một vấn đề khi sử dụng góc, RequireJS, Karma và Jasmine và tôi đã tìm ra hai cách để giải quyết nó.Tôi tạo ra một nhà cung cấp cho các chức năng phun như là một phụ thuộc riêng biệt trong các thử nghiệm của tôi.Ví dụ MyInjectorProvider cung cấp một trường hợp singleton $ injector. báo cáo sau:

beforeEach(module("app")); 
beforeEach(inject(function($injector){ 
    ... 
}) 

bên trong mô tả bộ thử nghiệm. Vì vậy, đây là cách nó nhìn trước:

define(['services/SignupFormValidator'], function(validator){ 
    var validator; 
    beforeEach(module("app")); 
    beforeEach(inject(function($injector){ 
     validator = $injector.get("SignupFormValidator"); 
    }) 

    describe("Signup Validation Tests", function(){ 
     it("...", function(){...}); 
    }); 
}); 

Sau khi áp dụng việc sửa chữa nó trông như thế này:

define(['services/SignupFormValidator'], function(validator){ 
    var validator; 

    describe("Signup Validation Tests", function(){ 
     beforeEach(module("app")); 
     beforeEach(inject(function($injector){ 
      validator = $injector.get("SignupFormValidator"); 
     }); 

     it("...", function(){...}); 
    }); 
}); 

Cả giải pháp làm việc trong trường hợp của tôi.

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