-1

私は現在、Jasmine + KarmaでAngularJSの関数をテストしています。私はオブジェクトを作成し、それがデータベースに正常に追加されたかどうかを確認しようとしています。この関数は、私がテストで考えることができない別の非同期関数を呼び出します。私はそれが戻って何も受け取っていないので、それが呼び出されることはありません知っている。コンソールログやエラーなどはありません。

myApp.service("StoringService", function($http){ 

    // Stores my object 
    this.store = function(object,success,error){ 
     var request = { 
      method: "post", 
      url: "example.com", 
      headers: {/*...*/}, 
      data: object.toJSON() 
     }; 
     $http(request).then(
      function(response){ 
       console.log("Success! Yay!"); 
       success(response.data.url.script); 
      },function(response){ 
       console.log("Error! Bummer..."); 
       error(response); 
      } 
     ); 
    }; 
}); 

私がテストしていメインコントローラが私のCreationControllerです。今のところ、私は次のようになりますStoringServiceと呼ばれるサービスを、持っています。これには、上記のサービスを呼び出すSubmitという関数があります。これはアプリケーションを実行すると機能しますが、テストを実行しているようには見えません。 (CreationController内側)提出方法は次のようなものになります。私はジャスミン+カルマテストに着いたとき最後に、私は私のオブジェクトが作成されていなかったことに気づい

myApp.controller("CreationController", ["$scope","StoringService", 
    function($scope,StoringService){ 

     $scope.newObject = new Object(); 
     $scope.successAlert = false; // changed by success() in StoringService 
     $scope.errorAlert = false; // changed by error() in StoringService 

     $scope.submit = function(){ 
      StoringService.store($scope.newObject, 
       function(message){ 
        console.log(message); 
       }, 
       function(error){ 
        console.log(error); 
       } 
      ); 
     } 
}]); 

を、さらに検査して、私のStoringServiceが働いていること実際の$ http要求(サンプルコードの11行目)まで細かくしてください。私はこの行動を引き起こす方法は完全にはわかりません。これは現在、私のテストの様子です。

//creation_test.js 
var scope, service; 

describe('Creation Test', function(){ 
    originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; 
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; 

    beforeEach(module('MyApplication')); 
    beforeEach(inject($rootScope, $controller, $injector){ 

     scope = $rootScope.$new(); 
     service = $injector.get('StoringService'); 

     $controller('CreationController',{ 
      $scope: scope, 
      StoringService: service 
     }); 
    })); 

    // Fails but should pass 
    it('should create an object',function(done){ 
     scope.newObject.name = "new_object"; 
     scope.newObject.data = "object data"; 
     scope.submit(); 
     setTimeout(function(){ 
      expect(scope.successAlert).toBe(true); 
      expect(scope.errorAlert).toBe(false); 
      done(); 
     },5000); 
    }); 

    afterEach(function(){ 
     jasmine.DEFAULT_TIMEOUT_INTERVL = originalTimeout; 
    }); 
); 

なぜこれが動作しないのか、どのくらい正確に修正するのかは完全にはわかりません。 successAlertとerrorAlertの値は決して変更されないので、$ http要求が呼び出されることはありません。私はhereから可能な解決策を試してきましたが、これまでのところ、問題は解決していません。私は本当にこの問題を解決する助けに感謝し、誰かが解決策を見つけたならば、私は非常に満足しています。

+0

テストしようとしていますか?私は 'CreationController'オブジェクトを作成していません。 – Puigcerber

+0

オブジェクトがデータベースに正常に作成されたかどうかをテストしようとしています。私はそれが必要かどうか分からなかったので、そのコードを残しました。しかし空白のオブジェクトは単にObject {name: ""、data: ""、timestamp: ""}のように見えます。フォームを使用して、ユーザーは名前とデータのフィールドを入力し、データベースに送信します。 –

+0

あなたがしようとしていることは、e2eテストです。それは、通常、カルマで実行する必要のないものです。角度単位テストは、実際の要求が実行されないことを前提としています。 ** 2つの**テストがあるはずです - モックされたサービスを持つコントローラユニット用のものと、モックされた$ http応答を持つサービスユニット用のものです。単体テストは単体テストをテストします。したがって、名前をテストします。彼らは「オールインワン」テストではありません。 – estus

答えて

0

私はあなたのテストを微調整しています。単体テストでは、バックエンドを呼び出す時間を費やしたくないので、HTTPコールを偽装する必要があります。あなたのstoreメソッドが約束を返すので、私たちは制御できる遅延プロミスを作成するユニットテストでこの動作をエミュレートします。後でresolveまたはreject成功とエラーをテストする約束をすることができます。私はそれが助けて欲しい

関連する問題