Jasmine 监视导入模块(打字稿)

bup*_*min 5 jasmine typescript

我正在尝试使用 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();
    })
  })
});
Run Code Online (Sandbox Code Playgroud)

然后在辅助类中,我只是将回调函数包装在承诺中:

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);
        });
      }
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

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

编辑

我如何调用测试:

 ./node_modules/.bin/ts-node ./node_modules/.bin/jasmine spec/utils/Helpers-spec.ts 
Run Code Online (Sandbox Code Playgroud)

bup*_*min 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);
        });
      }
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

然后进行准系统测试:

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();
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

感谢@brian-lives-outdoors 的帮助!