Jasmine单元测试定义作为全局变量导入的库

时间:2016-12-16 21:14:54

标签: jasmine pdfmake

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

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

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

pdfService:

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

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

如何在测试中用模拟替换此库?

我尝试过使用间谍但是因为makePdf不是一个不起作用的功能。 spyOn(service, 'makePdf')

我尝试将其设置为变量,但也没有效果我得到:严格模式禁止隐式创建全局属性&pdfMake&#39;

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

declare var pdfMake;

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

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

};