首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$httpBackend.expect()应该去哪里?

$httpBackend.expect()应该去哪里?
EN

Stack Overflow用户
提问于 2015-08-10 15:31:26
回答 1查看 1.3K关注 0票数 1

下列测试通过:

admin.controller.js

代码语言:javascript
复制
angular
  .module('mean-starter')
  .controller('AdminController', AdminController);

function AdminController(User, Auth, $state) {
  var vm = this;
  User
    .list()
    .success(function(data) {
      vm.users = data;
    })
    .error(function() {
      console.log('Problem getting users.');
    });

  vm.delete = function(id) {
    User
      .delete(id)
      .success(function(data) {
        if (Auth.getCurrentUser()._id === id) Auth.logout(); // deleting yourself
        else $state.reload();
      })
      .error(function() {
        console.log('Problem deleting user.');
      });
  };
}

admin.controller.spec.js

代码语言:javascript
复制
describe('AdminController', function() {
  var AdminController, $httpBackend;

  beforeEach(module('mean-starter'));
  beforeEach(module('templates'));
  beforeEach(inject(function($controller, $rootScope, _$httpBackend_) {
    $httpBackend = _$httpBackend_;
    AdminController = $controller('AdminController');
  }));

  afterEach(function() {
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
  });

  it('gets users', function() {
    $httpBackend
      .expectGET('/users')
      .respond('foo');
    $httpBackend.flush();
  });
});

我可没指望会这样。以下是我所预期的情况:

  1. 控制器在beforeEach中实例化。
  2. User.list()被运行。
  3. $http尚未被$httpBackend覆盖,因此请求通常会发出。
  4. $httpBackend.expectGET('/users').respond('foo')期望GET /users。然后说,“如果我收到这个请求,我会用'foo‘来回复。”
  5. $httpBackend.flush()说:“为$httpBackend收到的任何请求发送定义的响应。”
  6. .expectGET失败是因为它没有接收到它的请求(请求发生在期望之前)。
  7. .flush()抛出一个错误,因为没有什么需要刷新的。

我没有得到我所期望的结果,所以我上面的逻辑一定是错的--这是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-10 15:52:38

$http尚未被$httpBackend覆盖,因此请求通常会发出。

这不是一个正确的假设。$httpBackend在单元测试中自动使用(它是用于单元测试的ng模拟模块的一部分)。因此,无论您在单元测试代码中是否使用$httpBackend,它都在那里,它正在处理代码生成的所有$http请求。

想想看,如果它没有这样做,您的单元测试可能会发出真正的请求。

编辑

对于这种情况,控制器在实例化后立即发出HTTP请求,我喜欢在您实例化控制器之前将$httpBackend.expectGET()调用放在beforeEach块中。

我还会在flush()块中使用beforeEach后端。我认为,这清楚地表明,这些请求发生在控制器启动时。这意味着我不需要在每个单元测试中都有这样的期望。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31923569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档