我有想要测试的角色服务。在他的一个方法中,我使用$ http的角度服务。我只是想模拟那个函数(更具体的是模拟$ http.post函数),它会返回我想要的东西并将这个模拟注入我的服务测试。
我试图找到解决方案,但我找到了$ httpBackend,但我不确定这对我有帮助。
MyService看起来像这样:
angular.module('app').service('MyService' , function (dependencies) {
let service = this;
service.methodToTest = function () {
$http.post('url').then(function () {
// Do something
});
}
}
请注意$ http.post()返回promise,所以我认为我需要考虑一下。
答案 0 :(得分:1)
这听起来恰恰是$httpBackend
的用途。
如果您在测试中注入$http.post
,我可能也可以通过执行$http.post = jasmine.createSpy();
之类的操作来模拟$http
,但我不知道。
如果你确实使用$httpBackend
,也许这个例子可以帮助你在茉莉花测试中做这样的事情
beforeEach(inject(function(_$httpBackend_){
// The injector unwraps the underscores (_) from around the parameter names when matching
$httpBackend = _$httpBackend_;
$httpBackend.whenRoute('POST', 'url')
.respond(function(method, url, data, headers, params) {
expect(somevariable).toContain(params.something);
return [200, '{"progress":601}'];
});
}));
$httpBackend
会拦截所有$http.post
到url
并执行此功能。它应该像提交给实际methodToTest
的{{1}}一样,并获得假的返回值。
返回值表示成功的http状态代码(200),并返回您在第二个参数中放置的任何内容作为响应的url
属性(此处为data
)。这将在response.data == '{"progress":601}'
函数中。见How do I mock $http in AngularJS service Jasmine test?
then
函数只是一个示例(不需要),表明如果需要,可以在其中放置expect
子句。
答案 1 :(得分:1)
请注意
$http.post()
返回承诺,所以我认为我需要考虑这一点。
服务需要返回该承诺:
angular.module('app').service('MyService' , function (dependencies) {
let service = this;
service.methodToTest = function () {
//$http.post('url').then(function () {
//vvvv RETURN http promise
return $http.post('url').then(function () {
// Do something
});
}
}
当函数省略return
语句时,它返回值undefined
。服务无法向用户指示成功或失败。