棱角分明的茉莉花,试图测试工厂功能

angular jasmine, trying to test a factory function

本文关键字:测试 工厂 功能 茉莉花      更新时间:2023-09-26

我真的很陌生,第一次尝试单元测试。我有以下模块:

var app = angular.
module('webportal',
[
    'vr.directives.slider',
    'angular-flexslider',
    'LocalStorageModule',
    'multi-select',
    'djds4rce.angular-socialshare'
]).run(function ($FB) {//facebook share...should we move this somewhere else?
    $FB.init('xxxxx')
});

以及以下两家工厂:

angular.module('webportal').factory('uri', function () {
    var uri = {};
    uri.base = '';
    uri.setBase = function (base) {
        uri.base = base;
    };

    uri.getBase = function () {
        return uri.base;
    }
    return uri;
});
app.factory('portal', ['uri', function (uri) {
    var portal = {};
    portal.getLink = function (id) {
        return uri.getBase() + langHalf + '/property/' + id;
    };
    return portal;
}])

我正在尝试对 uri 和门户工厂内的函数进行单元测试。

这是我的尝试:

describe('Unit: Factory Test', function () {
    var uri;
    beforeEach(function () {
        angular.mock.module('vr.directives.slider', []);
        angular.mock.module('angular-flexslider', []);
        angular.mock.module('LocalStorageModule', []);
        angular.mock.module('multi-select', []);
        angular.mock.module('djds4rce.angular-socialshare', []);
        module('webportal', [
            'vr.directives.slider',
            'angular-flexslider',
            'LocalStorageModule',
            'multi-select',
            'djds4rce.angular-socialshare'
        ]);
        beforeEach(module('uri'));

    });

    it("baseSettingTest", function () {
        var uri = new uri();
        //var uri = new uri;
        var baseSettingTest = 'testing base';
        uri.setBase(baseSettingTest);
        expect(uri.getBase()).toEqual(baseSettingTest);
    })
})

所以当我运行这个时,它会失败并出现以下错误:

FAILED Unit: Factory Test baseSettingTest
TypeError: undefined is not a function
    at Object.<anonymous> (http://localhost:9876/base/tests/portaltestjs/portal.test.js:50:19)
    at attemptSync (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1759:24)
    at QueueRunner.run (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1747:9)
    at QueueRunner.execute (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1733:10)
    at Spec.Env.queueRunnerFactory (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:569:35)
    at Spec.execute (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:318:10)
    at Object.fn (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:2072:43)
    at attemptAsync (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1789:24)
    at QueueRunner.run (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1745:16)
    at QueueRunner.execute (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1733:10)
  window.__karma__.result   
  specDone  
  dispatch  
  (anonymous function)  
  specResultCallback    
  complete  
  clearStack    
  QueueRunner.run   
  QueueRunner.execute   
  Env.queueRunnerFactory    
  Spec.execute  
  fn    
  attemptAsync  
  QueueRunner.run   
  QueueRunner.execute   
  Env.queueRunnerFactory    
  Suite.execute 
  fn    
  attemptAsync  
  QueueRunner.run   
  QueueRunner.execute   
  Env.queueRunnerFactory    
  Suite.execute 
  allFns.push.fn    
  attemptAsync  
  QueueRunner.run   
  QueueRunner.execute   
  Env.queueRunnerFactory    
  Env.execute   
  env.executeFiltered   
  (anonymous function)  
  window.__karma__.loaded   
  (anonymous function)  
Skipped 0 tests

很明显,我没有正确初始化 uri。

  1. 如何初始化 uri 工厂? 并尝试测试函数?
  2. 如何初始化门户工厂并尝试测试函数?

您需要注入服务,然后可以在该服务上调用方法,这是我在我的 ng-样板项目中如何做到这一点的:

  beforeEach(module('ng-boilerplate'));
  var NameService;
  beforeEach(inject(function (_NameService_) {
    NameService = _NameService_;
  }));
  describe('#formatName()', function() {
    it('should title case a given string', function() {
      expect(NameService.formatName('IAN')).to.equal('Ian');
  // ...etc...

您必须为"uri"模板添加引用的第一件事

describe('Unit: Factory Test', function () {
    var uri;
    beforeEach(function () {
        angular.mock.module('vr.directives.slider', []);
        angular.mock.module('angular-flexslider', []);
        angular.mock.module('LocalStorageModule', []);
        angular.mock.module('multi-select', []);
        angular.mock.module('djds4rce.angular-socialshare', []);
        module('webportal', [
            'vr.directives.slider',
            'angular-flexslider',
            'LocalStorageModule',
            'multi-select',
            'djds4rce.angular-socialshare'
        ]);
        //beforeEach(module('uri')); please comment out this line
        beforeEach(module('webportal')) //you should load module instead of load your factory
    });
    // Use below block code to inject your factory into uri variable
    beforeEach(inject(function (_$injector_) {
        uri = _$injector_.get('uri');   //Inject uri factory into uri variable
    }));
    // For now your uri factory available for testing
    it("baseSettingTest", function () {
        spyOn(uri, 'setBase'); //spy on you setBase function
        var baseSettingTest = 'testing base';
        uri.setBase(baseSettingTest);       
        expect(uri.getBase).toHaveBeenCalled(); //Make sure getBase function was called
    })
})

我修改了您的代码中的某些内容,可以帮助您