Mock在模块中导出函数

时间:2016-08-04 09:52:50

标签: javascript unit-testing jasmine ecmascript-6

我有两个包含导出功能的模块。 “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);
});

2 个答案:

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