我不完全确定如何执行此操作,但我有一个端点URL,它是登录身份验证的POST请求。添加请求有效内容时,您将获得成功的登录凭据或错误。但是,我似乎在获取响应方面遇到了问题。
以下是我的规范文件:
describe('Service: AuthFactory',function(){
beforeEach(function () {
module('ui.router');
module('users');
module('main');
});
var AuthFactory, httpBackend;
beforeEach(inject(function($httpBackend, $rootScope, $controller, _AuthFactory_){
httpBackend = $httpBackend;
AuthFactory = _AuthFactory_;
}));
it('Return a POST response from a Service function', function() {
var url = "http://localhost:3000";
var dataObj = JSON.stringify({
inputUser: { user: "TestCase1" },
inputPass: { password: "TestPass1" }
});
httpBackend.expect('POST', url + '/api/AuthService/signIn', dataObj)
.respond({});
AuthFactory.signIn(dataObj).success(function(response) {
console.log(response);
// outputs Object {}
// when in reality it should
// output the response to POST
// eg: { "login": { "user": "Test_User", "time": 54935934593 }, "outputHead": { "token": asjfjj234kfAd } }
});
httpBackend.flush();
expect(true).toBe(true);
});
});
这是我的Service
。
angular.module('users').factory('AuthFactory', ['$http', function($http) {
var AuthFactory = {};
AuthFactory.signIn = function(data) {
return $http.post('http://127.0.0.1:3000/api/AuthService/signIn', data);
};
AuthFactory.signOut = function(data) {
return $http.post('http://127.0.0.1:3000/api/AuthService/signOut', data);
};
return AuthFactory;
}]);
当我运行测试时,它会(显然)通过console.log()
输出Object{}
。
当我使用像Postman这样的Chrome扩展程序时。我做一个示例POST请求,返回的响应是登录凭据!那么为什么它在Postman上工作,而不是在我的AngularJS
Jasmine单元测试中呢?
答案 0 :(得分:4)
这一行就是你得到一个空对象作为回应的原因:
httpBackend.expect('POST', url + '/api/AuthService/signIn', dataObj)
.respond({});
要提供您想要的回复,只需添加以下内容:
httpBackend.expect('POST', url + '/api/AuthService/signIn', dataObj)
.respond({"login": { "user": "Test_User", "time": 54935934593 }, "outputHead": { "token": asjfjj234kfAd }});
有关详细信息,请参阅documentation。
答案 1 :(得分:1)
要记住的主要事情是你正在嘲笑后端服务请求,而不是真正点击服务。 这是通过以下声明完成的:
httpBackend.expect('POST', url + '/api/AuthService/signIn', dataObj)
.respond({});
这说明匹配此网址的POST,伪造一个空对象的响应。如果你想伪造一个看起来像你的真实响应的响应,你可以简单地在.response函数调用中设置该对象。
示例:
.respond({login:myuser,authenticated=true}).
如果您正在尝试测试后端API,则需要查看其他测试框架,例如量角器;
答案 2 :(得分:0)
你正在使用$ httpBackend服务嘲笑你的后端,这意味着,它不会成为真正的请求,但是当你发布到url + '/api/AuthService/signIn'
时,你的模拟后端将以空对象({{ 1}})
您应该使用您的真实后端返回的相同类型的数据进行响应。重点是,您可以控制要测试的案例。因此,您可以为失败或成功登录编写API响应
如果您在邮递员中提出请求,那将会使用您的真实后端,这就是差异
更多信息: https://docs.angularjs.org/api/ngMock/service/ $ httpBackend http://www.yearofmoo.com/2013/01/full-spectrum-testing-with-angularjs-and-karma.html