我正在为调用Promise的范围函数编写测试,并且我试图访问在promise解析后设置的某些范围属性。
这基本上是我的控制器功能:
$scope.submitNewForm = function (){
Service.createUser($scope.user).then(function(result){
if (result){
$scope.message = 'success';
} else {
$scope.message = 'error';
}
$scope.$apply();
});
};
我非常想测试的是,在调用范围函数后,我的$scope.message
被设置了。
到目前为止,我已使用$q.defer()
进行了一些测试,但没有成功
beforeEach(inject(function ($controller, $rootScope, _Service_, $q) {
scope = $rootScope.$new();
Service= _Service_;
deferred = $q.defer();
UserController= $controller('UserController', {
$scope: scope
});
}));
it('should call Service.createUser and set a message', function(){
spyOn(Service, 'createUser').and.callFake(function () {
return deferred.promise;
});
scope.submitNewForm();
scope.$digest();
expect(scope.message).toBeDefined();
});
关于我失踪的想法?
答案 0 :(得分:2)
在运行测试时,您可能会收到此类错误。
那是因为您只是从promise
的{{1}}方法创建的spy
返回了Service
。
你可以做些什么来修复它?
只需在createUser
内进行deferred.reject
或deferred.resolve
,即可定义spy
。像这样:
scope.message
还有一件事我想建议。您应该将所有间谍保留在注入服务的spyOn(Service, 'createUser').and.callFake(function () {
deferred.resolve('success');
return deferred.promise;
});
块内并模拟beforeEach
对象。这样他们就可以重复使用了。
<强>更新强> 要将更改应用于范围,您可以执行以下操作:
controller
不确定这是否有效,但这是通常的做法。