我正试图在我的控制器测试中模拟这个'usermanager'提供程序,但我总是得到这个错误
TypeError: Attempted to assign to readonly property.
at workFn (c:{...}/bower_components/angular-mocks/angular-mocks.js:2105)
这是我的控制器:
angular.module('sasApp')
.controller('RegisterCtrl', function ($scope, usermanager) {
// variables
$scope.captcha = {};
// Get captcha from server
usermanager.getCaptcha().then(function (captcha) {
$scope.captcha = captcha;
}, function (reason) {
console.log('Failed: ' + reason);
});
});
这是我的测试:
describe('Controller: RegisterCtrl', function () {
// load the controller's module
beforeEach(module('sasApp'));
var RegisterCtrl,
scope,
mockUsermanager;
mockUsermanager = {
getCaptcha: function () {
return {
test: 1
};
}
};
// Initialize the controller and a mock scope
beforeEach(inject(function ($controller, $rootScope) {
scope = $rootScope.$new();
RegisterCtrl = $controller('RegisterCtrl', {
$scope: scope,
usermanager: mockUsermanager
});
}));
describe('Initialization', function () {
it('should have \'captcha\' object defined', function () {
expect(scope.captcha).toBeDefined();
});
});
});
问题是,在我尝试设置'usermanager'提供程序的模拟之前,我没有收到此错误。如果我在beforeEach语句中删除'usermanager:mockUsermanager'行,那么它运行良好。
你能发现什么是错的吗?提前谢谢!
答案 0 :(得分:1)
这可能不是最好的答案,但我已经制作了一个不会在这里重现问题的Plnkr: http://plnkr.co/GgUeKnsvxEHmD3Wcyocx?p=preview
快速说明:
usermanager.getCaptcha()
必须返回一个承诺,否则当它尝试调用.then
时,下一部分测试会爆炸。所以我只是假装了一个。
如果您发现任何差异,请告诉我(例如,我不知道您所使用的角度版本)。我可以看到更新