0

ほとんどの問題は、私とAPIの間のやりとりの形式が変更されたときに発生します。私は、APIと話している私のサービスを試してみたい。このサービスで$httpを使用している場合は、どのように私のサービスをテストに注入して適切な結果を得ることができますか?このタイプの統合テストの単体テストツールであるjasmineを使うべきですか?ジャスミンで角度サービスによって返されたAPI応答形式をテストする

この例では、私は$httpを使用し、約束を返し、テストはこのようになりますOntologyServiceテストしています:

describe('Service: OntologyService', function() { 
    var OntologyService, $scope; 
    beforeEach(function() { 
     module('oneClickRegistrationApp'); 
     inject(function ($injector) { 
      OntologyService = $injector.get('OntologyService'); 
      $scope = $injector.get('$rootScope').$new(); 
     }); 
    }); 

    it('should return the object of ontologies', inject(function() { 
     var ontoServerApiUrl = 'https://myurl.com/api/ksearch/ontologies/'; 
     OntologyService.getAllOntologies(ontoServerApiUrl).then(function (ontologies) { 
      expect(ontologies).toBeNonEmptyObject(); 
      expect(ontologies["licenses"]).toHaveArrayOfObjects(); 
      expect(ontologies["species"]).toHaveArrayOfObjects(); 
      expect(ontologies["measurement_methods"].length).toBeGreaterThan(10); 
     }); 
     $scope.$digest(); 
    })); 
}); 

私は次のエラーメッセージになっている:

PhantomJS 1.9.8 (Mac OS X 0.0.0) Service: OntologyService should return the object of ontologies FAILED 
    Error: Unexpected request: GET https://myurl.com/api/ksearch/ontologies/hbp_data_modality_ontology?size=10000 
    No more request expected 
     at $httpBackend (/Users/katkov/WebstormProjects/one-click/bower_components/angular-mocks/angular-mocks.js:1323) 
     at sendReq (/Users/katkov/WebstormProjects/one-click/bower_components/angular/angular.js:10761) 
     at /Users/katkov/WebstormProjects/one-click/bower_components/angular/angular.js:10470 
     at processQueue (/Users/katkov/WebstormProjects/one-click/bower_components/angular/angular.js:14991) 
     at /Users/katkov/WebstormProjects/one-click/bower_components/angular/angular.js:15007 
     at /Users/katkov/WebstormProjects/one-click/bower_components/angular/angular.js:16251 
     at /Users/katkov/WebstormProjects/one-click/bower_components/angular/angular.js:16069 
     at /Users/katkov/WebstormProjects/one-click/test/spec/services/realontologyservice.js:32 
     at invoke (/Users/katkov/WebstormProjects/one-click/bower_components/angular/angular.js:4535) 
     at workFn (/Users/katkov/WebstormProjects/one-click/bower_components/angular-mocks/angular-mocks.js:2517) 
    undefined 
PhantomJS 1.9.8 (Mac OS X 0.0.0): Executed 9 of 9 (1 FAILED) (0.016 secs/0.158 secs) 

答えて

1

Error: Unexpected request: GET https://

このブログ記事では、次の内容をカバーしています。http://www.bradoncode.com/blog/2015/06/16/unit-test-http-ngmock-passthrough/

... $ httpBackendサービスは、私が試すことができますように、実際のHTTP呼び出しを行うためにいいだろう... ...

をテスト対象のコードで使用されるすべてのHTTPリクエストを模擬するために、私たちを必要とし、いくつかのJSONなどのサンプルを入手してください。

... ngMockにはngMockE2Eが含まれています。このため、偽のバックエンドHTTP呼び出しを作成できますが、これは完全なアプリケーション、つまり単体テストではなくブラウザー経由でのみ使用できます。 ..

作成方法はこちら実際のHTTPリクエスト

describe('real http tests', function() { 

    beforeEach(angular.mock.http.init); 
    afterEach(angular.mock.http.reset); 

    beforeEach(inject(function(_$controller_, _$httpBackend_) { 
    $controller = _$controller_; 
    $scope = {}; 
    $httpBackend = _$httpBackend_; 

    // Note that this HTTP backend is ngMockE2E's, and will make a real HTTP request 
    $httpBackend.whenGET('http://www.omdbapi.com/?s=terminator').passThrough(); 
    })); 

    it('should load default movies (with real http request)', function (done) { 
    var moviesController = $controller('MovieController', { $scope: $scope }); 

    setTimeout(function() { 
     expect($scope.movies).not.toEqual([]); 
     done(); 
    }, 1000); 

    }); 

}); 
+0

ありがとう、非常に貴重!私は単体テストやblablaの哲学に反していることを理解していますが、実際にはその機能が本当に必要でした。 – ganqqwerty

関連する問題