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

Javascript 棱角分明的茉莉花,试图测试工厂功能,javascript,angularjs,karma-runner,karma-jasmine,Javascript,Angularjs,Karma Runner,Karma Jasmine,我对angular非常陌生,第一次尝试进行unittest。 我有以下模块: var app = angular. module('webportal', [ 'vr.directives.slider', 'angular-flexslider', 'LocalStorageModule', 'multi-select', 'djds4rce.angular-socialshare' ]).run(function ($FB) {//facebook s

我对angular非常陌生,第一次尝试进行unittest。 我有以下模块:

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
故障单元:工厂测试基础设置测试
TypeError:undefined不是函数
反对。(http://localhost:9876/base/tests/portaltestjs/portal.test.js:50:19)
尝试同步(http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine core/jasmine.js:1759:24)
在QueueRunner.run(http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine core/jasmine.js:1747:9)
在QueueRunner.execute(http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine core/jasmine.js:1733:10)
在Spec.Env.QueueRunner工厂(http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine core/jasmine.js:569:35)
按规定执行(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)
异步尝试(http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine core/jasmine.js:1789:24)
在QueueRunner.run(http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine core/jasmine.js:1745:16)
在QueueRunner.execute(http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine core/jasmine.js:1733:10)
窗口。\因果报应\结果
斯派克登
派遣
(匿名函数)
specResultCallback
完成
清除钉
QueueRunner.run
QueueRunner.execute
Env.queueRunnerFactory
规格执行
fn
尝试异步
QueueRunner.run
QueueRunner.execute
Env.queueRunnerFactory
Suite.execute
fn
尝试异步
QueueRunner.run
QueueRunner.execute
Env.queueRunnerFactory
Suite.execute
所有fns.push.fn
尝试异步
QueueRunner.run
QueueRunner.execute
Env.queueRunnerFactory
环境执行
环境执行过滤
(匿名函数)
窗口。\ uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
(匿名函数)
跳过了0个测试
很明显,我没有正确初始化uri

  • 如何初始化uri工厂?试着测试一个函数
  • 如何初始化门户工厂?并尝试测试功能

  • 您需要注入该服务,然后可以调用该服务上的方法,以下是我在项目中的做法:


    首先必须将引用添加到“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
        })
    })
    
    我已经修改了你代码中的某些内容,帮助它可以帮助你

    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
        })
    })