让我们假设一个封装纯Javascript模型的角度服务。它有一个简单的异步方法,它使用promise resolve返回它收到的相同参数(仅用于演示)。
angular.module('app', [])
.factory('MyModel', ['$q', function ($q) {
function MyModelConstructor() {
this.test = function(myParam) {
var deferred = $q.defer();
if (myParam) {
// Not triggering then callback
deferred.resolve(myParam);
}
return deferred.promise;
}
}
return MyModelConstructor;
}]);
调用测试方法后,永远不会触发回调。但是,如果我将测试方法作为文字附加到构造函数创建的对象,一切正常:
it('should not fail!!!', function() {
myModelExample = new MyModel();
var result;
expect(result).toBeUndefined();
myModelExample.test(111).then(function(funresult) {
result = funesult;
});
$rootScope.$apply();
expect(result).toBe(111); // But it fails
});
it('should have working promise', function() {
myModelExample = new MyModel();
var result;
expect(result).toBeUndefined();
myModelExample.test = function(myParam) {
var deferred = $q.defer();
if (myParam) {
deferred.resolve(myParam);
}
return deferred.promise;
}
myModelExample.test(111).then(function(funresult) {
result = funresult;
});
$rootScope.$apply();
expect(result).toBe(111); // This way does not fail
});
在触发构造函数创建的方法和文字方法之间的回调方面有什么区别?如何在构造函数中附加的测试方法触发回调?
答案 0 :(得分:1)
你有两个错误:错字
result = funesult;
你还没有在测试中定义myModelExample
,所以
myModelExample = new MyModel();
答案 1 :(得分:-1)
这是一个工作的掠夺者:http://plnkr.co/edit/w3lDprPJVk6HSVSpXI7i?p=preview
1)MyModel
未在测试中实例化。
2)$rootScope.$apply
和expect
应该在promise回调中