javascript - 单元测试 AngularJS Controller ,同时遵循最佳实践

标签 javascript angularjs unit-testing karma-runner karma-jasmine

我们正在按照 here 概述的一些最佳实践指南构建 AngularJS 应用程序。 .

我特别有兴趣测试一个非常简单的 Controller 来启动并运行 karma。

Controller 代码是:

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();
    });

});

这会失败,因为期望定义未定义。

如果我将 Controller 更改为:

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

function Login($scope){

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

}

测试随后按预期通过。我不确定如何引用以上述链接中概述的方式编写的 Controller 以使测试通过。

最佳答案

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

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

关于javascript - 单元测试 AngularJS Controller ,同时遵循最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28297235/

相关文章:

javascript - 415 不支持的媒体类型 jQuery Ajax

javascript - 如何在 React Native 中使用 AsyncStorage multiGet 检索数据

javascript - 如果我在同一 View 上多次使用同一个 ng-include,如何为它提供不同的行为?

java - 如何测试这个文件写入,3lines 功能?

java - 如何在 splinter 的测试环境中继续前进?

javascript onclick 时间函数

javascript - vue的图片加载问题

angularjs - Internet Explorer 11 替换了授权 header

javascript - 使用 babel 和 webpack 减少转译代码助手

iphone - 为 iPhone/iPad 编写单元测试的最佳方法是什么?