我有一个我想测试的 Angular 服务。在他的方法之一中,我使用 Angular 服务的 $http 。我只是想模拟该函数(更具体地说是模拟 $http.post 函数),它将返回我想要的任何内容,并将此模拟注入(inject)到我的服务测试中。
我试图寻找解决方案,并找到了 $httpBackend,但我不确定这是否可以帮助我。
MyService 看起来像这样:
angular.module('app').service('MyService' , function (dependencies) {
let service = this;
service.methodToTest = function () {
$http.post('url').then(function () {
// Do something
});
}
}
- 我想测试 methodToTest 并注入(inject) $http.post() 的模拟
P.S 请记住 $http.post() 返回 promise ,所以我认为我需要考虑这一点。
最佳答案
这听起来就像 $httpBackend
是为了.
如果您注入(inject) ,您也可以通过执行类似
在你的测试中,但我不知道。$http.post = jasmine.createSpy();
的操作来仅模拟 $http.post
$http
如果您确实使用$httpBackend
,也许这个示例可以帮助您,在您的 Jasmine 测试中执行类似的操作
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
并执行此函数。它应该就像提交到实际 url
的 methodToTest
一样,并得到了你的假返回值。
返回值表示成功的 http 状态代码 (200),并返回您在第二个参数中输入的任何内容作为响应的 data
属性(此处 response.data == '{ “进度”:601}'
)。这将在 then
函数中。请参阅How do I mock $http in AngularJS service Jasmine test?
这里的 expect
函数只是一个示例(不需要),向您展示如果需要,您可以在其中放置 expect
子句。
关于javascript - 如何模拟 Jasmine 中其他服务方法中调用的 $http.post 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42789183/