我有两个包含导出功能的模块。 “ModuleB”使用“ModuleA”中的函数。现在我想测试“ModuleB”并模拟“ModuleA”中使用过的函数。
我和巴贝尔一起使用ES6。为了测试我使用业力和茉莉。
我尝试使用babel-rewire和inject-loader,但它只是不起作用。我对这一切都不熟悉,我想我只是做错了什么。所以任何帮助都表示赞赏!
moduleA.js
export function getResult() {
return realResult;
}
moduleB.js
import * as ModuleA from './moduleA'
export function functionToTest() {
let result = ModuleA.getResult();
// do stuff with result which I want to test
}
我的测试
it("does the right thing", () => {
// I tried using rewire, but this gives me an exception:
ModuleB.__Rewire__('ModuleA', {
getResult: () => {
return fakeResult;
}
});
let xyz = ModuleB.functionToTest(canvas, element);
});
答案 0 :(得分:1)
看看这个图书馆https://www.npmjs.com/package/mockery我认为这正是你想要的。希望它有所帮助!
编辑:
基本上你必须在每个测试中使用mock来模拟你的函数,唯一的问题是你必须使用require来导入你要模拟的模块。看这个例子:
const moduleUnderTest = './moduleB.js';
const moduleA_fake = { getResult: () => { return "This is a fake result"; } } ;
describe("Mocking functions", () => {
it('Should be Fake Result', (done) => {
mock.registerAllowable(moduleUnderTest);
mock.registerMock('./moduleA.js', moduleA_fake);
mock.enable({ useCleanCache: true });
let ModuleB = require(moduleUnderTest);
let res = ModuleB.functionToTest();
res.should.be.eql("This is a fake result");
mock.disable();
mock.deregisterAll();
done();
});
it('Should be Real Result', (done) => {
let ModuleB = require(moduleUnderTest);
let res = ModuleB.functionToTest();
res.should.be.eql("real foo");
done();
});
});
您可以看到完整示例Here
答案 1 :(得分:0)
对于对babel-rewire
如何使用感兴趣的任何人:诀窍是使用__RewireAPI__
。
import * as ModuleB from '../ModuleB'
import {__RewireAPI__ as ModuleBRewire} from '../ModuleA';
it("does the right thing", () => {
let moduleAMock = {
getResult: () => {
return fakeResult;
}
}
ModuleBRewire.__Rewire__('ModuleA', moduleAMock);
let xyz = ModuleB.functionToTest();
});