【问题标题】:Jasmine Unit testing define library that was imported as a global variableJasmine 单元测试定义作为全局变量导入的库
【发布时间】:2016-12-16 21:14:54
【问题描述】:

我有一个使用 pdfMake 生成 PDF 的项目。要使用它,我将文件包含在我的 index.html 中

<script src='js/pdfmake.js'></script>
<script src='js/vfs_fonts.js'></script>

在 pdfmake.js 内部,它声明了 global["pdfMake"],然后允许我在我的服务中使用该库。

pdf服务:

pdfMake.createPdf(docDefinition).download(fileName);

一切都很好,但是当我尝试在我的服务中测试这个方法时,我收到一个错误,即测试找不到变量 pdfMake。考虑到它是由 index.html 加载的,这是有道理的。

如何在我的测试中用模拟替换这个库?

我尝试过使用间谍,但由于 makePdf 不是一个不起作用的函数。 spyOn(service, 'makePdf').

我尝试将其设置为变量,但这也不起作用,我得到:严格模式禁止隐式创建全局属性 'pdfMake'

pdfMake = {
  createPdf: jasmine.createSpy('createPdf').and.returnValue({
    download: jasmine.createSpy('download')
  }
}

【问题讨论】:

  • 它应该可以工作。你看过stackoverflow.com/questions/13794637/…吗?
  • 如果其他人对此有疑问,首先要摆脱隐式创建错误,请确保首先声明变量,以便 var pdfMake 并在创建间谍时将其附加到窗口对象

标签: jasmine pdfmake


【解决方案1】:

我遇到了同样的问题并解决了在单元测试内的全局变量窗口上插入 pdfMake 模拟。所以,在你的情况下会是这样的:

window.pdfMake = {
  createPdf: jasmine.createSpy('createPdf')
  .and.returnValue({
    download: jasmine.createSpy('download')
  }),
};

【讨论】:

    【解决方案2】:

    我刚刚通过以下更改解决了这个问题-

    在您的 .ts 文件中全局声明 pdfMake 变量,例如-

    declare var pdfMake;
    

    然后像这样在你的 .spec 文件中模拟 pdfMake 函数-

    window['pdfMake'] = {
    createPdf: function (param) {
      return {
        open: function () {
          return true;
        },
        download: function () {
          return true;
        }
      };
    }
    

    };

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-13
      • 2011-07-29
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      相关资源
      最近更新 更多