1

这是我正在测试的控制器:

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.');
      });
  };
}

我的测试:

describe('AdminController', function() {
  var createController, scope, $httpBackend;

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

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

  it('gets users', function() {
    var users = [ 'user1', 'user2', 'user3' ];
    $httpBackend
      .expectGET('/users')
      .respond(users);
    var adminController = createController();
    $httpBackend.flush();
    expect(adminController.users).toEqual(users);
  });

  it('has a method that deletes users', function() {
    $httpBackend.expectDELETE('/users/1').respond();
    $httpBackend.expectGET('/current-user').respond();
    $httpBackend.expectGET('/logout').respond();
    var adminController = createController();
    adminController.delete(1);
    $httpBackend.flush();
  });
});

它目前失败:

在此处输入图像描述

它希望我$httpBackend.expectGET('/users')在我的第二个it街区有一个。我不想那样做。it对我来说,如果每个块测试一个单独的东西,它似乎更加模块化和有组织。


1)我该怎么办?

2)为什么我会收到$digest already in progress错误消息?

4

1 回答 1

1
  1. 你是对的,每个人都it应该测试一个单独的东西。这些it块是单独的测试,它们不(不应该)相互依赖。第二个测试创建一个新的控制器实例,它反过来尝试立即加载用户。即使您在这里对这个请求不感兴趣,您仍然需要设置处理它的模拟。您也可以使用.when(...).respond(...)表格代替expect.

编辑:使这个更好的一种方法是将 GET 的模拟移动到beforeEachas 中$httpBackend.expectGET('/users').respond(users)。这样,第一个 GET 的模拟将适用于所有it测试,因此在测试其他内容时,您无需担心它。至于第一个it,也许只做就够了expect(adminController.users).toEqual(users)。(对于控制器如何获取用户没有明确的期望,只有价值——但这显然来自 GET,因此覆盖范围基本相同。)

  1. 会不会是这样的:https ://github.com/angular/angular.js/pull/6522 ?
于 2015-08-08T17:38:16.050 回答