javascript - 如何模拟 Jasmine 中其他服务方法中调用的 $http.post 方法?

标签 javascript angularjs unit-testing mocking jasmine

我有一个我想测试的 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.posturl 并执行此函数。它应该就像提交到实际 urlmethodToTest 一样,并得到了你的假返回值。

返回值表示成功的 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/

相关文章:

javascript - Javascript 中是否存在本质上只读的对象?

ios - iTunesConnect AngularJS 错误

java - JOOQ MockDataProvider - 如何根据某些条件返回不同的模拟?

c# - NUnit 在测试中保持静态数据

python - 单元测试发现测试根目录时出现 ImportError

javascript - 确定图像跨浏览器的原始大小?

Javascript PHPMyAdmin Like 字段选择(ctrl + 箭头键)

javascript - 在react中显示纯html

javascript 从 url 获取 id 有两个选项。

angularjs - 在 md-radio-button 中保存 bool 值?