Я звоню в службу API, которая возвращает обещание с завода.
Вот часть моей фабрики.
factories.factory('OnBoardingFactory', ['$http',
function ($http) {
var dataFactory = {};
dataFactory.get = function (url) {
return $http.get('http://localhost/api/onboarding/' + url)
};
return dataFactory
}
]);
И вот где его вызвали из контроллера:
OnBoardingFactory.get('login?username=test&password=password')
.then(function(response){
$scope.response = response.status;
})
Это полностью возвращает данные в контроллере. Однако у меня возникают трудности, когда я прихожу, чтобы проверить это. Вот мой тестовый скрипт:
var scope, FakeOnBoardingFactory, controller, q, deferred;
beforeEach(module('app.module'));
beforeEach(function () {
FakeOnBoardingFactory = {
get: function () {
deferred = q.defer();
// Place the fake return object here
deferred.resolve({ response: {status: 200}});
return deferred.promise;
}
};
spyOn(FakeOnBoardingFactory, 'get').and.callThrough();
});
beforeEach(inject(function ($q, $rootScope, $controller, $injector ) {
scope = $rootScope.$new();
q = $q;
controller = $controller(OnBoardingCtrl, {
$scope: scope,
OnBoardingFactory: FakeOnBoardingFactory
})
}));
it('Should call the form and return 200', function () {
// Execute form
scope.loginCredentials({$valid: true});
scope.$apply();
// Ensure script is called (which passes fine)
expect(FakeOnBoardingFactory.get).toHaveBeenCalled();
scope.$apply();
// BREAKS HERE
expect(scope.status).toBe(200);
})
Когда expect(FakeOnBoardingFactory.get).toHaveBeenCalled();
называется, это проходит отлично. Однако затем я запускаю expect(scope.status).toBe(200)
, он прерывает "Ожидаемое неопределенное значение 200".
Это указывает на то, что мой FakeOnBoardingFactory не возвращает никаких данных. Но я не могу найти проблему.
Это должно быть изменение для поддержки нескольких утверждений тела, которые вызвали эту ошибку. Обходной путь на данный момент заключается в том, чтобы либо не использовать ожидаемый, либо делать свое утверждение в обратном вызове конца функции. Так что вместо.expect(200) это будет так.
end(function(err,res) { res.status.should.equal(200) },
или если вы используете ожидание.. вам нужно убедиться, что вы указываете тело, а также просто статус.
it('should assert status only 1', function(done){
var app = express();
app.get('/user', function(req, res){
res.send(201, { name: 'tobi' }); }); request(app) .get('/user')
.expect('Content-Type', /json/)
.expect('Content-Length', '20')
.expect(201)
.end(function(err, res){
if (err) throw err;
});
})