单元测试 AngularJS 控制器,同时遵循最佳实践

Unit testing AngularJS Controller whilst following best practice

我们正在按照 here.

概述的一些最佳实践指南构建一个 AngularJS 应用程序

我特别有兴趣测试一个非常简单的控制器来起床和 运行 业力。

控制器代码为:

angular.module('ttn').controller('Login', Login);

function Login(){

    var login = this;
    login.title = 'foo bar content here etc';

}

规格代码为:

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

    beforeEach(module('ttn'));

    var scope, controller;

    beforeEach(inject(function ($controller, $rootScope) {

        scope = $rootScope.$new();

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

        scope.$digest();

    }));

    it('should define a title', function () {
        expect(scope.title).toBeDefined();
    });

});

这失败了,期望未定义被定义。

如果我将控制器更改为:

angular.module('ttn').controller('Login', Login);

function Login($scope){

    $scope.title = 'foo bar whatsit jibber';

}

然后测试按预期通过了。我不确定如何引用以上述方式编写的控制器 link 以使测试通过。

由于您的控制器不使用 $scope,因此您不应注入它并在测试中使用它。相反,您应该检查控制器上的标题:

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

    beforeEach(module('ttn'));

    var controller;

    beforeEach(inject(function ($controller) {

        controller = $controller('Login', {});

    }));

    it('should define a title', function () {
        expect(controller.title).toBeDefined();
    });

});

Plunkr