2

私は単体テストと AngularJS の初心者で、修正できない問題がいくつかあります。私のテストの1つが機能していません。テストで値に影響を与えて location.path() を開始しようとしていますが、コントローラーでは location.path() にまだ未定義の値があります。

これが私のコントローラーです:

angular.module('...')
.controller('SignUpCtrl', ['$location', function ($location) {

    // Retrieve type of user
    var userType = $location.path().substr(9);
    if(userType == 'member'){
        userType = 'user';
    }

    console.log($location.path());
    console.log(userType);

    $scope.uType = userType;  ]);

そして、ここに私のテストモジュールがあります:

describe('Controller: SignUpCtrl', function () {

// load the controller's module
beforeEach(module('...'));

var SignUpCtrl,
    scope,
    mockBackend,
    environments,
    location,
    store;

beforeEach(inject(function ($controller, $rootScope, $httpBackend,$location,_Environments_) {
    environments = _Environments_;
    mockBackend = $httpBackend;
    location = $location;
    scope = $rootScope.$new();

    SignUpCtrl = $controller('SignUpCtrl', {
        $scope: scope,
        $location: location
    });
}));

it('should come from the right location', function(){
    location.path('/sign-up/member');
    expect(location.path()).toBe('/sign-up/member');

    expect(scope.uType).toBe('user'); //Do not work
});

});

4

1 に答える 1

2

単体テストを使用して、エンド ツー エンド (または E2E) テストを使用してのみ実際に達成できることを実行しようとしています。AngularJS の単体テストは、特定のモジュールまたはサブモジュール ( 、 、 など) 内の JavaScript をテストするように設計されてservicefactoryますdirective。ただし、ページ ナビゲーションやブラウザーの場所などは、エンド ツー エンドのテスト環境で実際にテストする必要があります。

そのため、 $location オブジェクトにはすべての通常のメソッド ( pathurlなど) がありません。$location オブジェクトは、モジュールで取得する実際の $location オブジェクトの単純な "モック" になります。したがって、テスト ケースをit('should come from the right location', function(){ ... })エンド ツー エンド テストに移動してから、他のモジュール固有の単体テストを続行する必要があります。$scopeその後、次のように、変数を取得するだけで $controller を単純化できます。

scope = $rootScope.new();
SignUpCtrl = $controller('SignUpCtrl', {$scope: scope});

E2E テストのガイドは、このリンクにあります。優れた E2E テストを作成する方法について説明します。Protractor と呼ばれる角度のある E2E テストを実行するための非常に優れたフレームワークがあります。そのための情報はこのリンクにあります。分度器は、E2E テストを処理するためのより良い方法として、まもなく (1.2 で) Karma に取って代わります。

于 2013-10-14T17:05:39.820 に答える