使用vm时从单元测试文件访问$scope“;ControllerAs“;AngularJS Hottown的语法

使用vm时从单元测试文件访问$scope“;ControllerAs“;AngularJS Hottown的语法,angularjs,angularjs-scope,jasmine,karma-runner,hottowel,Angularjs,Angularjs Scope,Jasmine,Karma Runner,Hottowel,例如,请参见此处: 正如标题所示,我遵循本教程[设置单元测试,一切都很好,除了事实我似乎无法将vm变量作为$scope访问。 dashboard.js var controllerId = 'dashboard'; angular.module('app') .controller(controllerId, ['common', 'datacontext', dashboard]); function dashboard(common, datacontext) { var

例如,请参见此处:

正如标题所示,我遵循本教程[设置单元测试,一切都很好,除了事实我似乎无法将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';
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");
        });
    });
});
dashboard.Spec.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';
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失败测试消息为:预期未定义为“仪表板”


感谢您的帮助!

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

 it("should assign Dashboard as title", function () {
       var vm = controller("dashboard", { $scope: scope });
       expect(vm.title).toBe("Dashboard");
    });
您也可以这样做:

it("should assign Dashboard as title", function () {
    var controller = controller("dashboard as vm", { $scope: scope });

    expect(scope.vm.title).toBe("Dashboard");
});

当控制器不需要时,为什么您必须在测试中向控制器注入
$scope
?我认为使用ControllerAs的整个想法是停止使用scope?@Junaid您是对的,但我认为对于单元测试,您必须更加明确,因为您没有scope inhertant或$window。(当您使用console.log(this)时,controllerAs语法似乎使用了哪种语法)我只是在没有
$scope
变量的情况下做到了这一点。也就是说,在每个
之前的
中,我做了
controller=$controller
,在实际测试中我做了
var vm=controller(“仪表板”)
--无
$rootScope
$scope
anywhere@Tom我的操作方法与您描述的完全相同。但是,我总是收到错误消息,指出需要$scope。因此,我必须按照
var vm=controller('dashboard',{$scope:{}}});