使对象在要测试的函数中可用
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
将使用它?
我将使用 mocha
和 nodejs
进行测试。
我通过将 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()
)。
如何使在测试模块中创建的对象在要测试的函数中可用?
例如,测试代码从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
将使用它?
我将使用 mocha
和 nodejs
进行测试。
我通过将 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()
)。