我在尝试测试控制器时遇到了问题。
我只是将代码抛出此处,然后解释问题所在。
控制器
// 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未定义?
答案 0 :(得分:1)
解决了它。 结束使用$ q而不是Q(无论如何建议,但之前似乎没有工作)。
此外,在测试中,我现在可以调用控制器上的activate方法,如下所示:
scope.$digest(vm.activate());
这解决了我。