【问题标题】:Angular - Unit Testing Modal Factory CallAngular - 单元测试模式工厂调用
【发布时间】:2017-08-04 21:23:42
【问题描述】:

我正在尝试验证是否从模态函数中调用了工厂函数,如果传递了有效的文件对象。工厂被注入模态控制器,当测试运行时工厂是未定义的。测试从模态中调用工厂函数的正确方法是什么?

模态控制器

  angular.module('vicModule')
  .controller('vicModalController', vicModalController);

  vicModalController.$inject = [
    '$uibModalInstance',
    '$uibModal',
    'utilFunctionsFactory'
  ]

  function vicModalController($uibModalInstance, $uibModal, utilFunctionsFactory) {
    mvm.uploadVICs = uploadVICs;

    function uploadVICs(file, error) {
      if (file == null) {
        data.errorMessage = 'file is not found or not supported';
        return;
      }
      if(error.length > 0) {
        $uibModalInstance.close();
        data.errorMessage = 'reading file error';
        return;
      } else {
        var fileData = utilFunctionsFactory.validateCSV(file, error);
      }
    }
  }

模态控制器测试

describe('vicModalController', function() {
  var $controller, vicModalController, vicFactory, utilFunctionsFactory, $q, $scope, $httpBackend, deferred, $uibModalInstance;
  beforeEach(module('fotaAdminPortal'));
  beforeEach(module('vicModule'));
  beforeEach(inject(function(_$controller_, _vicFactory_, _utilFunctionsFactory_, _$q_, _$rootScope_, _$httpBackend_) {
    $controller = _$controller_;
    vicFactory = _vicFactory_;
    utilFunctionsFactory: _utilFunctionsFactory_;
    $q = _$q_;
    $rootScope = _$rootScope_;
    $scope = $rootScope.$new();
    $httpBackend = _$httpBackend_;
    $uibModalInstance = { // Create a mock object using spies
      close: jasmine.createSpy('modalInstance.close'),
      dismiss: jasmine.createSpy('modalInstance.dismiss'),
      result: {
        then: jasmine.createSpy('modalInstance.result.then')
      }
    };
    vicModalController = $controller('vicModalController', {
      vicFactory: vicFactory,
      utilFunctionsFactory: utilFunctionsFactory,
      $uibModalInstance: $uibModalInstance
    });
  }));
  it('should be defined', function() {
    expect(vicModalController).toBeDefined();
  });
  describe('uploadVICS()', function() {
    beforeEach(inject(function(_utilFunctionsFactory_) {
      utilFunctionsFactory = _utilFunctionsFactory_;
      spyOn(utilFunctionsFactory, 'validateCSV').and.callFake(function() {
        return {};
      });
    }));
    it('should call validateCSV() with valid file', function() {
      vicModalController.uploadVICs({}, []);
      expect(utilFunctionsFactory.validateCSV()).toHaveBeenCalledWith({}, []);
    });
  });
});

编辑

我在 beforeEach 中分配错误:

utilFunctionsFactory: utilFunctionsFactory; //不正确的冒号 utilFunctionsFactory = utilFunctionsFactory; // 应该赋值

【问题讨论】:

    标签: angularjs unit-testing karma-jasmine


    【解决方案1】:

    我看到的几个问题:

    你正在做:

    utilFunctionsFactory: _utilFunctionsFactory_;
    

    代替:

    utilFunctionsFactory = _utilFunctionsFactory_;
    

    您还断言validateCSV 的结果被调用:

    expect(utilFunctionsFactory.validateCSV()).toHaveBeenCalledWith({}, []);
    

    而不是validateCSV 本身:

    expect(utilFunctionsFactory.validateCSV).toHaveBeenCalledWith({}, []);
    

    【讨论】:

    • 你是对的,虽然我已经明白了。无论如何,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多