2017-01-25 21 views
9

Tôi có một tuyến đường mẫu như thế này:Angular JS Testing với Karma Jasmine

angular 
     .module('appRouter',['ui.router']) 
     .config(function($stateProvider,$urlRouterProvider){ 
      $stateProvider 
       ..... 
       ..... 
       .state('settings.account',{ 
        url:'/account', 
        templateUrl:'templates/account.html', 
        controller:function(resolveData){ 
         console.log(resolveData); 
        }, 
        resolve:{ 
         resolveData : function($http){ 
          var root = 'https://jsonplaceholder.typicode.com'; 
          return $http.get(root+'/posts/1').then(function(response){ 

           return response.data; 
          }); 
         } 
        } 
       }); 

      ..... 

Nó chỉ là một URL thử nghiệm nơi tôi có thể nhận được dữ liệu JSON mẫu trực tuyến

https://jsonplaceholder.typicode.com/posts/1

Tôi muốn kiểm tra trạng thái.

beforeEach(function(){ 
     module('appRouter'); 
    }); 

    beforeEach(inject(function(_$rootScope_,_$injector_,_$state_,_$httpBackend_,$templateCache){ 
     $rootScope = _$rootScope_; 
     $state = _$state_; 
     $injector = _$injector_; 
     $httpBackend = _$httpBackend_; 
     $templateCache.put('templates/account.html',''); 
    })); 

    it('should resolve "resolveData"',function(){ 
     const state = $state.get('settings.account'); 
     const resolveFn = state.resolve.resolveData; 

       $httpBackend.whenGET('https://jsonplaceholder.typicode.com/posts/1').respond(function(){ 
     return [ 
      200,{ 
       "userId": 1, 
       "id": 1, 
       "title": "...", 
       "body": "..." 
     }] 
    }); 

    $httpBackend.expectGET('https://jsonplaceholder.typicode.com/posts/1'); 

    $injector.invoke(resolveFn); 

    $httpBackend.flush(); 

    expect($injector.annotate(resolveFn)).toEqual(['$http']); 

    console.log(angular.mock.dump($scope)); 

    expect($scope.resolveData).toEqual({ 
     "userId": 1, 
     "id": 1, 
     "title": "...", 
     "body": "..." 
    }); 

Nhưng điều này không thành công. Nói

1) should resolve "resolveData" 
    UI Routerer Config For Account 
    Expected undefined to equal Object({ userId: 1, id: 1, title: '...', body: '...' }). 
    at Object.<anonymous> (test/controllers/main-controller-spec.js:114:36) 

Tôi đang làm gì sai?

CẬP NHẬT

console.log(angular.mock.dump($scope)); đưa ra sau

enter image description here

Xin vui lòng giúp.

+0

Tôi nghĩ rằng có giá trị trong câu hỏi ban đầu bạn đã yêu cầu (trước khi chỉnh sửa), với lỗi ban đầu. Thông báo lỗi mới này sẽ là một câu hỏi mới.Cả hai đều là hai vấn đề riêng biệt, cần được xử lý riêng. –

+2

tôi không hiểu chính xác những gì bạn đang cố gắng thử nghiệm ở đây. Tôi có nghĩa là: kiểm tra nên kiểm tra xem mã của bạn đang làm một số logic bạn mong đợi nó để làm. Nhưng thay vào đó (theo như tôi có thể thấy), kiểm tra của bạn sẽ kiểm tra xem bạn có thể lấy một số json từ một số yêu cầu hay không. Đó không phải là mục đích của các xét nghiệm. Có thể là mục đích tốt của các thử nghiệm phía máy chủ. Thay vào đó, tôi đề nghị bạn gọi một số dịch vụ bên trong "giải quyết" (chỉ cần thay thế cuộc gọi $ http bằng cách tiêm một số dịch vụ và gọi một trong các phương thức của nó), bây giờ bạn có thể kiểm tra dịch vụ ifs được gọi là "state.go" và nếu dịch vụ được gọi với thông số chính xác. (Thats ý kiến ​​của tôi) – happyZZR1400

Trả lời

1
should resolve "resolveData" 
UI Routerer Config For Account 
TypeError: Cannot read property 'get' of undefined 
at resolveData (app/appRouter.js:25:41) 
at Object.<anonymous> (test/controllers/main-controller-spec.js:97:9) 

để giải quyết vấn đề này, bạn nên vượt qua $http để giải quyết chức năng dữ liệu.

resolveFn($http); 

nhưng nó tốt hơn để viết bài kiểm tra như this

+0

Xin lỗi nhưng điều này nói 'ReferenceError: $ http không được định nghĩa'. Xin hãy nhìn vào nó. – StrugglingCoder

+0

có bạn phải tiêm $ http trong bài kiểm tra của bạn – fingerpich

+0

Tôi đã làm điều đó. Và nó không thành công khi nói lỗi tôi đã đề cập. Làm thế nào để vượt qua? – StrugglingCoder

2

gốc Lỗi:

should resolve "resolveData" 
UI Routerer Config For Account 
TypeError: Cannot read property 'get' of undefined 
    at resolveData (app/appRouter.js:25:41) 
    at Object.<anonymous> (test/controllers/main-controller-spec.js:97:9) 

What am I doing wrong?

Bạn đang kêu gọi resolveFn() trong thử nghiệm đơn vị của bạn. Chức năng được xác định là yêu cầu dịch vụ $http và cuộc gọi đó không vượt qua dịch vụ $http (như được đề cập là fingerpich).

Để sửa lỗi này, cho phép góc để xử lý việc chèn phụ thuộc bằng cách sử dụng $injector.invoke(resolveFn).

Xem hoạt động này với plunk. Lưu ý kiểm tra không thành công vì một lý do khác. Tuy nhiên, (nếu tôi hiểu các quy tắc một cách chính xác) đó là một vấn đề khác nhau nên được trả lời bằng một câu hỏi khác (nếu bạn cần thêm trợ giúp).

Lưu ý phụ: Khi trang web (không phải thử nghiệm đơn vị) được mở trong trình duyệt, tôi hy vọng nó hoạt động, vì góc tiêm phụ thuộc $http vào hàm được gán cho resolveData.

Nhìn vào answer cũng tham chiếu đến blog được đề cập bởi fingerpich.

Đây là blog tôi thấy hữu ích khi tìm hiểu về unit testing AngularJS.

+0

Tôi đã cố gắng như vậy nhưng nó không làm việc cho tôi. Nó nói 'Mong đợi không xác định đối tượng bằng nhau ({userId: 1, id: 1, title: ...' khi tôi mong đợi '$ scope.resolveData' để khớp với dữ liệu JSON. Tôi đang làm gì sai? – StrugglingCoder

+0

Bạn vẫn nhận được lỗi 'nên giải quyết" resolveData "... TypeError: Không thể đọc thuộc tính 'get' của undefined ...'? Nếu không, câu hỏi ban đầu của bạn nên được giải quyết và lỗi được đề cập trong phần bình luận sẽ rơi vào một câu hỏi mới. –

+0

Có lẽ một nudge nhỏ sẽ giúp với lỗi mới: thêm 'console.log (angular.mock.dump ($ scope));' trước câu lệnh 'expect' ở cuối bài kiểm tra. Sau đó, kiểm tra cách' .then() 'được sử dụng với lệnh' $ injector.invoke() '[ở đây] (http://stackoverflow.com/questions/29080657/testing-ui-router-stateprovider-resolve-values/29128751#29128751) (Tôi đã bao gồm liên kết này trong câu trả lời của tôi) –

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