一尘不染

使用AngularJS HotTowel中的vm“ ControllerAs”语法从单元测试文件访问$ scope

angularjs

例如,请参见此处:http : //www.johnpapa.net/angularjss-controller-as-and-the-vm-
variable/

就像标题所暗示的那样,我将按照本教程 [http://tech.pro/tutorial/1473/getting-started-with-
angularjs-unit-testing]进行单元测试,事实证明一切都很好。 我似乎无法将vm变量 作为$ scope 来访问。

dashboard.js

var controllerId = 'dashboard';
angular.module('app')
    .controller(controllerId, ['common', 'datacontext', dashboard]);


function dashboard(common, datacontext) {
    var getLogFn = common.logger.getLogFn;
    var log = getLogFn(controllerId);

    var vm = this;      
    vm.title = 'Dashboard';

仪表板.Spec.js

describe("app module", function() {
    beforeEach(module("app"));

    describe("dashboard", function() {
        var scope,
            controller;

        beforeEach(inject(function($rootScope, $controller) {
            scope = $rootScope.$new();
            controller = $controller;
        }));

        it("should assign Dashboard as title", function() {
            controller("dashboard", {
                $scope: scope
            });
            expect(scope.title).toBe("Dashboard");
        });
    });
});

我尝试过的方法:当我直接在控制器依赖项中命名“ $ scope”并将其设置为“ title”属性时,它可以工作(测试通过)。但是,我想保持原样。

我还尝试过直接在依赖项中传递$ scope并将控制器参数命名为“ vm” …

Karmas测试失败消息为: 预期未定义为“仪表板”

感谢任何帮助!


阅读 230

收藏
2020-07-04

共1个答案

一尘不染

嗯,现在很明显…我可以通过引用测试中创建的控制器来访问vm变量:

 it("should assign Dashboard as title", function () {
       var vm = controller("dashboard", { $scope: scope });
       expect(vm.title).toBe("Dashboard");
    });
2020-07-04