使对象在要测试的函数中可用

Make an object available in the function to be tested

如何使在测试模块中创建的对象在要测试的函数中可用?

例如,测试代码从xmldom模块中获取一个DOMParserclass:

测试:

import assert from 'assert';
import { DOMParser } from 'xmldom';
import { parseHtml } from './../src/parse-html.es6';

describe('HTML Parser', function () {
    it('Hello World', function () {
        parseHtml();
    });
});

那个 DOMParser class 应该是被测试函数中使用的那个:

parseHtml():

export function parseHtml(html) {
    const parser = new DOMParser();

    return parser.parseFromString(
        `<html><head></head><body>${html}</body></html>`,
        'text/html'
    );
}

如何获得 DOMParser class 以便 parseHtml 将使用它?

我将使用 mochanodejs 进行测试。

我通过将 parseHtml 函数重组为 class 并在我的测试中传递 die DOMParser() 对象解决了这个问题。

test/parse.js

import chai from 'chai';
import xmldom from 'xmldom';
import Parse from './../src/parse.es6';

const { assert } = chai;
const { DOMParser } = xmldom;

let parse;

describe('Parser', function () {
    beforeEach(function () {
        parse = new Parse(DOMParser);
    });

    it('should parse HTML', function () {
        let html = parse.html('');

        assert.ok(html);
    });
});

parse.es6

export default class Parse {
    constructor (domparser) {
        // This hack is needed for testing. To emulte the browsers DOMParser.
        this.domparser = !domparser ? new DOMParser() : new domparser();
    }

    html(body) {
        return this.domparser.parseFromString(
            `<html><head></head><body>${body}</body></html>`,
            'text/html'
        );
    }
}

还受益于更好地扩展解析器。 :)

您可以使用 sinon 来监视或存根 xmldom 类:

import assert from 'assert';
import * as sinon from 'sinon';
import { parseHtml } from './../src/parse-html.es6';
import { default as xmldom } from 'xmldom';

// Spy on the xmldom.DOMParser() constructor
var spy = sinon.spy(xmldom, 'DOMParser');

describe('HTML Parser', function () {
  it('Hello World', function () {
    parseHtml();
    // Check if the constructor was called once (and only once)
    assert(spy.calledOnce);
  });
});

在每次测试之前,确保重置间谍 (spy.reset())。