Angular / Karma / Jasmine - undefined不是一个对象(评估' commLogger.SetLogLevel')

时间:2017-04-26 04:07:41

标签: angularjs jasmine karma-runner

我正在尝试学习Karma和茉莉花单元测试,但我目前在这里遇到错误。我试图研究这个网站的所有答案,但没有找到答案。

以下是我的单元测试文件。

describe('CommLogger', function() {
    var commLogger;

    beforeEach(module('FileLoggerManager'));

    beforeEach(inject(function (CommLogger) {
        commLogger = CommLogger;
    }));

    describe('SetLogLevel', function() {
       it('SetLogLevel Spec', function () {
            var logLevel = 0;
            commLogger.SetLogLevel(logLevel);
            expect(commLogger.SetLogLevel).toHaveBeenCalledWith(logLevel);
       });
    });
});

这是我要进行单元测试的js文件。

(function() {
    'use strict';
    angular
        .module('FileLoggerManager')
        .service('CommLogger', Body);

        function Body(LocalData, $q, $timeout) {
            var service = {
                writeLog: writeLog,
                SetFilePath: SetFilePath,
                SetMaxLogSize: SetMaxLogSize,
                DeleteLogFiles: DeleteLogFiles
            };

            var maxloglevel = 2;

            function SetLogLevel (logLevel) {
                console.log("Comm Logger: Set log level to " + logLevel);
                maxloglevel = logLevel;
            }

            return service;
        }
})();   

我很乐意感谢任何帮助。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我认为问题是您的CommLogger服务没有公开公开SetLogLevel功能。尝试在此处添加:

var service = {
  ...
  SetLogLevel: SetLogLevel
};

另外,如果你想使用toHaveBeenCalledWith,你需要监视这个功能:

describe('SetLogLevel', function() {
  it('SetLogLevel Spec', function () {
    spyOn(commLogger, 'SetLogLevel').and.callThrough();
    var logLevel = 0;
    commLogger.SetLogLevel(logLevel);
    expect(commLogger.SetLogLevel).toHaveBeenCalledWith(logLevel);
  });
});

查看有关jasmine spies的更多信息。