2013-08-11 10 views
8

ジャスミンとangularJSでコードをテストする方法を理解しようとしています。私はコントローラと注入されたサービスを備えたテストプロジェクトを書いた。今私はコントローラをテストし、注入されたサービスを模擬しようとします。しかし、私はコントローラから "到着"機能をテストする方法を見つけられませんでした。ここに私のjsfiddleです:http://jsfiddle.net/2fwxS/ジャスミンでangularJSを注入したコントローラをテストする

controller.js:

angular.module('myApp.controllers', []) 
    .controller('MyCtrl', ['$scope', 'MyService', function ($scope, MyService) { 
    $scope.User = {}; 
    $scope.HasUserArrived = false; 
    $scope.Arrived = function(firstname, lastname) { 
    $scope.HasUserArrived = MyService.Arrive(firstname, lastname); 
    return $scope.HasUserArrived; 
    } 
}]); 

services.js:

var myApp = angular.module('myApp.services', []). 
    value('version', '0.1'); 

myApp.factory('MyService', [function() { 
    return { 
     HasArrived: false, 
     Arrive: function (firstname, lastname) { 
      this.HasArrived = false; 

      if (firstname && lastname) { 
       this.HasArrived = true; 
      } 

      console.log("User has arrived: " + this.HasArrived); 
      return this.HasArrived; 
     } 
    } 
}]); 

私は$提供し、いくつかの同様の説明があることができました正しい解決策(How can I write jasmine test for angular controller and service like this?)またはcreateSpy (How do you mock Angular service that is a function?)、$ provider.factoryまたは$ provider.valueが必要なとき、またはcreateSpyをいつ使うべきかを理解できませんでしたか?誰かが違いを理解するために私を助け、私のjsFiddle(http://jsfiddle.net/2fwxS/)の例稼働中の非アクティブ化コードを取得することができれば、私は感謝

...

答えて

10

あなたが交換するために$provide.valueを使用する必要があります嘲笑1と元のサービスインスタンスは:$provide.value作品が、$provide.factoryがない理由

beforeEach(module(function($provide) { 
    var service = { 
     Arrive: function (firstname, lastname) { 
      if (firstname && lastname) { 
       return true; 
      } 
     } 
    }; 
    $provide.value('MyService', service); 
})); 

私は本当に知りません。後でAngularコードを見てみることにします。私は何かを見つけたらこの答えを更新します。

スパイについては、あなたのモックが想定どおりに使用されているかどうかをテストしたい場合に使用してください。これには、パラメータと呼び出しのチェックが含まれます。あなたのコードはスパイを使用するように変更されました:

it('checks that Arrived is correctly used', function() { 
    // Arrange 
    spyOn(service, 'Arrive'); 

    // Act 
    scope.Arrived('Franz', 'Kafka'); 

    // Assert 
    expect(service.Arrive).toHaveBeenCalledWith('Franz', 'Kafka'); 
}); 

ここにあなたの固定jsFiddleがあります。

+0

ご返信いただきまして申し訳ありません! @Michael答えと修正されたjsFiddleをありがとう。それらの少しの変更で、私は正常にテストを実行することができました! 実際、工場がなぜ機能しないのかを知ることはいいでしょう。 – burgerS

+0

私の同僚と私は、サービスを嘲笑するのではなく、この例の中でサービスをテストする方法があれば興味があります。サービスを個別にテストする必要があることはわかっていますが、この例の中のサービスをテストすることが可能かどうかは疑問でした... – burgerS

+1

サービスが非常に簡単であれば、コントローラをテストするためにサービスを試してみることができますその動作を安全に予測し、サービス実装のエラーのためコントローラテストを破る可能性を最小限に抑えます。しかし、そうしたら、サービスではなくコントローラをテストすることになります。あなたはそれが想定どおりに動作するように、サービスを別々にテストする必要があります。 –

関連する問題