AngularJS单元测试控制器

时间:2014-03-14 08:05:51

标签: angularjs unit-testing

我在尝试测试控制器时遇到了问题。

我只是将代码抛出此处,然后解释问题所在。

控制器

// Controller name is handy for logging
var controllerId = 'splash';

// Define the controller on the module.
// Inject the dependencies. 
// Point to the controller definition function.
angular.module('app').controller(controllerId,
    ['$scope', 'datacontext', splash]);

function splash($scope, datacontext) {
    // Using 'Controller As' syntax, so we assign this to the vm variable (for viewmodel).
    var vm = this;

    // Bindable properties and functions are placed on vm.
    vm.activate = activate;
    vm.title = 'Splash';
    vm.getRooms = function () {
        return vm.rooms;
    }
    activate();
    return vm;
    function activate() {
        datacontext.getRooms().then(function (data) {
            vm.rooms = data;
        });

    }
}

Datacontext方法

function getRooms() {
        var deferred = Q.defer();
        deferred.resolve([{ id: 1, Name: "A02" }, { id: 2, Name: "A03" }]);
        return deferred.promise;
    }

测试

it('should have a splash title', inject(function($q, datacontextMock) {
    var vm = testContext.$controller('splash', { $scope: scope, datacontext: datacontextMock });

    expect(vm.title).toEqual('Splash');
    expect(vm.rooms).not.toBeNull();

    console.log(vm);
    expect(vm.rooms).toEqual(testContext.rooms);
}));

问题是,测试失败了。 它会告诉我vm.rooms未定义......但事实并非如此。 使用console.log记录vm时,我实际上只需单击vm对象并查看其中的房间数组,即datacontext返回的数组。

为什么这告诉我vm.rooms未定义?

1 个答案:

答案 0 :(得分:1)

解决了它。 结束使用$ q而不是Q(无论如何建议,但之前似乎没有工作)。

此外,在测试中,我现在可以调用控制器上的activate方法,如下所示:

scope.$digest(vm.activate());

这解决了我。