茉莉花测试抱怨undefined不是一个对象

时间:2016-04-18 09:54:50

标签: javascript angularjs unit-testing jasmine

我使用AngularJs,我需要像这样用Jasmine测试我的init的元素:

var init = function () {
    _this.tenant = tenant.data;

    _this.types = [
      { value: "true", label: "Tenant" },
      { value: "false", label: "Project" }
    ];

    //Pre-select the good type
    var index;
    _.each(_this.types, function(data, idx) {
      if(_.isEqual(data.value, String(_this.tenant.divisible))) {
        index = idx;
      }
    });
    _this.tenant.divisible = _this.types[index].value;
  };
  init();

但是有一个错误:

  

undefined不是对象(评估'a.types [t] .value')

当我评论该行时:_this.tenant.divisible = _this.types[index].value;所有测试构建成功。我无法正确测试这条线。

这是我的测试:

describe('Controller: TenantEditCtrl', function () {
  beforeEach(module('app'));

  var ctrl;
  var state;

  beforeEach(inject(function ($state, $controller, $rootScope) {
    state = $state.get('app.tenant_edit');
    //TODO: test with proper data
    ctrl = $controller('TenantEditCtrl', {
      $scope: $rootScope.$new(),
      tenant: {
        data: {}
      }
    });
  }));

  it('should initialize state properly', function () {
    expect(state.url).toEqual('/tenants/edit/:id');
  });

  it('should resolve data', function () {
    expect(ctrl.tenant).not.toBeNull();
  });

})

1 个答案:

答案 0 :(得分:2)

表达式index中的

_this.tenant.divisible = _this.types[index].value;undefined,因为在测试中tenant.data设置为空对象且不具有divisible属性。当您对types进行迭代时,您将type.value"undefined"进行比较,但无法找到正确的类型。解决此问题的一种方法是使用正确的租户数据实例化控制器:

  beforeEach(inject(function ($state, $controller, $rootScope) {
    state = $state.get('app.tenant_edit');
    ctrl = $controller('TenantEditCtrl', {
      $scope: $rootScope.$new(),
      tenant: {
        data: {
          // set divisible
          divisible: true
        }
      }
    });
  }));