Вы должны попробовать использовать $q.defer()
вместо $q.$resolve()
it('should perform task A', function (done) { // use the done argument
var mockResponse = {msg: "Success"};
var defer = $q.defer();
spyOn(myService, 'AsyncTask').and.returnValue(defer);
$rootScope.$broadcast('callA'); // call the function
$rootScope.$apply(function(){
defer.resolve(mockResponse); // manually resolve the promise
});
defer.promise.then(function(response){
expect(response.msg).toEqual(mockResponse.msg);
done(); // Don't forget to invoke done. It tell Jasmine we've finished
});
// Propagate promise resolution to 'then' functions using $apply().
$rootScope.$apply();
});
Сначала передайте аргумент done
в ваш тест, он используется для асинхронных тестов.Используя $q.defer()
, вы можете контролировать, когда resolve
Promise
.Поместите expect
внутрь .then
, если вам нужно проверить результат своего обещания.Я добавил пример с использованием переменной mockResponse
, но он будет работать только в том случае, если в вашем коде this.aPromise.promise.then(function (response) {...
в конце вашей функции вы вернете response
.
Кроме того, нене забудьте вызвать done
, он сообщает Jasmine
, что мы с ним покончили.
И самое главное, вызовите $rootScope.$apply();
в конце, чтобы распространить разрешение обещания на .then
функции.
Надеюсь, это поможет