导入模块上的茉莉花间谍(打字稿)

时间:2018-08-10 18:02:10

标签: typescript jasmine

我正在尝试使用带有茉莉和打字稿的静态方法测试一个简单的实用程序类。问题是帮助程序类导入了一个第三方库来实现目标。我需要测试在任何情况下都调用此第三方库。

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 

2 个答案:

答案 0 :(得分:1)

这是您的代码的有效测试:

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

答案 1 :(得分:0)

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

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!