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

Angular/Karma/Jasmine - undefined is not an object (evaluating 'commLogger.SetLogLevel')

我正在尝试学习 Karma 和 Jasmine 单元测试,但我目前在这里遇到错误。我试图研究该站点中的所有答案,但没有找到答案。

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

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

如果有任何帮助,我将不胜感激。提前致谢!

我认为问题在于您的 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 的更多信息。