茉莉花间谍对进口模块(打字稿)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了茉莉花间谍对进口模块(打字稿)相关的知识,希望对你有一定的参考价值。

我试图用jasmine和typescript的静态方法测试一个简单的实用程序类。问题是帮助程序类导入第三方库以实现目标。我需要测试在每种情况下调用这个第三方库。

import Helpers from '../../src/utils/Helpers';
import {parseString} from 'xml2js';



describe('Helper class', function() {
  let mockParseString: any;

  describe('xmlToJson', function() {
    beforeEach(function(done) {
      mockParseString = jasmine.createSpy('parseString', parseString);
      // spyOn(xml2js, 'parseString').and.callFake(function(xml: string, callback: (error: any, data: object) => void) {
      //
      // });

      setTimeout(() => {
        done();
      }, 1);
    })


    it('calls library to parse string', async function(done) {
      await Helpers.xmlToJson('<div></div>');

      expect(mockParseString).toHaveBeenCalled();
      done();
    })
  })
});

然后在helper类中,我只是在promise中包含一个回调函数:

import {convertableToString, OptionsV2, parseString} from 'xml2js';
export default class Helpers {
  public static xmlToJson(xml: convertableToString, options?: OptionsV2): Promise<any> {
    return new Promise((resolve, reject) => {
      if(options) {
        parseString(xml, (err, results) => {
          if(err) {
            reject(err);
          }

          resolve(results);
        });
      } else {
        parseString(xml, options, (err, results) => {
          if(err) {
            reject(err);
          }

          resolve(results);
        });
      }
    })
  }
}

我得到的错误是没有调用间谍。我已经挖了一段时间,但我还没有办法让间谍工作。也许这根本不可能。

编辑

我如何调用测试:

 ./node_modules/.bin/ts-node ./node_modules/.bin/jasmine spec/utils/Helpers-spec.ts 
答案

这是您的代码的工作测试:

import Helpers from '../../src/utils/Helpers';
import * as xml2js from 'xml2js';

describe('Helper class', function() {

  let mockParseString;

  describe('xmlToJson', function() {

    beforeAll(() => {
      mockParseString = spyOn(xml2js, 'parseString').and.callThrough();
    });

    it('calls library to parse string', (done) => {
      (async () => {
        await Helpers.xmlToJson('<div></div>');
        expect(mockParseString).toHaveBeenCalled();
      })().then(() => done());
    });
  });
});
另一答案

最终,我无法通过隐式引用库来使其工作。我选择使用依赖注入解决方案,让我的类成为服务。无论如何,这最终可能更干净。 (我仍然需要清理类型,因为这很漂亮)

import {convertableToString, OptionsV2, parseString} from 'xml2js';

export default class Helpers {
  parseString: any;

  constructor(parseString: any) {
    this.parseString = parseString;
  }
  public xmlToJson(xml: convertableToString, options?: OptionsV2): Promise<any> {
    return new Promise((resolve, reject) => {
      if(options) {
        this.parseString(xml, (err: any, results: string) => {
          if(err) {
            reject(err);
          }

          resolve(results);
        });
      } else {
        this.parseString(xml, options, (err: any, results: string) => {
          if(err) {
            reject(err);
          }

          resolve(results);
        });
      }
    })
  }
}

然后准系统测试:

import Helpers from '../../src/utils/helpers';
import * as xml2js from 'xml2js';

describe('Helper class', function() {

  let mockParseString:any;

  describe('xmlToJson', function() {

    beforeAll(() => {
      mockParseString = spyOn(xml2js, 'parseString').and.callThrough();
    });

    it('calls library to parse string', async (done) => {
      let helper = new Helpers(mockParseString);

      await helper.xmlToJson('<div></div>');
      expect(mockParseString).toHaveBeenCalled();
      done();
    });
  });
});

感谢@ brian-lives-outdoors寻求帮助!

以上是关于茉莉花间谍对进口模块(打字稿)的主要内容,如果未能解决你的问题,请参考以下文章

markdown 打字稿...编码说明,提示,作弊,指南,代码片段和教程文章

如何在茉莉花中重置间谍?

json 打字稿片段

typescript 打字稿+角度1的启动片段

Bootstrap 手风琴在打字稿中不起作用

如何清理打字稿缓存?