8

jasmine と angularJS を使用してコードをテストする方法を理解しようとしています。コントローラーと挿入されたサービスを使用してテスト プロジェクトを作成しました。今、私はコントローラーをテストしたいので、注入されたサービスをモックしようとしました。しかし、コントローラーから「Arrived」機能をテストする方法が見つかりませんでした。これが私のjsfiddleです:http://jsfiddle.net/2fwxS/

コントローラー.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;
        }
    }
}]);

$provide が正しい解決策である可能性がある同様の説明をいくつか見つけました (このような角度コントローラーとサービスのジャスミン テストを作成するにはどうすればよいですか? ) または createSpy (関数である Angular サービスをどのようにモックしますか? ) しかし、できませんでした。 $provider.factory または $provider.value が必要な場合、または createSpy を使用する必要がある場合を理解するには?

誰かが違いを理解し、私の jsFiddle ( http://jsfiddle.net/2fwxS/ ) の例で非アクティブ化されたコードを取得して実行するのを手伝ってくれれば幸いです...

4

1 に答える 1

10

$provide.value元のサービス インスタンスをモック化されたものに置き換えるために使用する必要があります。

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

なぜ$provide.value機能するのか本当にわかりませんが、機能$provide.factoryしません。後で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です。

于 2013-08-11T20:48:47.343 に答える