2016-09-21 25 views
0

プロミスを呼び出すスコープ関数のテストを書いています。プロミスが解決した後に設定されたスコーププロパティにアクセスしようとしています。ジャスミンで約束を呼び出すテストスコープ関数

これは基本的に私のコントローラ機能である:

スコープ関数を呼び出した後、私の $scope.messageがsettedされ、場合である私はかなりテストしたい
$scope.submitNewForm = function(){ 
    Service.createUser($scope.user).then(function(result){ 
     if (result){ 
      $scope.message = 'success'; 
     } else { 
      $scope.message = 'error'; 
     } 
     $scope.$apply(); 
    }); 
}; 

これまでのところ私は$q.defer()を使用していくつかのテストをしたが、私は欠けているものに何の成功

beforeEach(inject(function ($controller, $rootScope, _Service_, $q) { 
    scope = $rootScope.$new(); 
    Service= _Service_; 
    deferred = $q.defer(); 
    UserController= $controller('UserController', { 
     $scope: scope 
    }); 
})); 

it('should call Service.createUser and set a message', function(){ 
    spyOn(Service, 'createUser').and.callFake(function() { 
     return deferred.promise; 
    }); 
    scope.submitNewForm(); 
    scope.$digest(); 
    expect(scope.message).toBeDefined(); 
}); 

任意のアイデアを持っていませんでしたか?

答えて

1

この種のテストを実行する際にエラーが発生する可能性があります。あなたは単にあなたがServicecreateUser方法で作成したspyからpromiseを返されてきたので、だ

Error on running the test

まあ。

あなたはそれを修正するために何ができますか? spyの中にdeferred.rejectまたはdeferred.resolveを入力すると、scope.messageが定義されます。このようなもの:

spyOn(Service, 'createUser').and.callFake(function() { 
    deferred.resolve('success'); 
    return deferred.promise; 
}); 

もう1つのことをお勧めします。サービスを注入し、controllerオブジェクトをモックするbeforeEachブロック内にすべてのスパイを保つ必要があります。そうすれば、彼らは再利用できるでしょう。

UPDATE: 範囲に変更を適用するには、あなたがこのような何かを行うことができます。

it('should call Service.createUser and set a message', function(){ 
    scope.submitNewForm(); 
    scope.$$postDigest(function(){ 
     scope.$digest(); 
     expect(scope.message).toBeDefined(); 
    }); 
}); 

ないこれが機能するかどうかを確認しますが、これは一般的に行われているものです。

+0

答えのSiddharthに感謝します。私は今、 'Error:[$ rootScope:inprog] $ digestがすでに進行中であることを確認しています。これはおそらく私のpromiseコールバックの中で' $ scope。$ apply() 'を呼び出すためです。しかし、私は私の見解に変更を適用する必要があります。何かご意見は? – adolfosrs

関連する問題