在单元测试时模拟 ES6 依赖项

Mock ES6 dependencies when unit testing

本文关键字:依赖 ES6 模拟 单元测试      更新时间:2023-09-26

假设以下两个 ES6 类:

my-random.js:

export default class MyRandom {
    get() { return Math.random(); }
}

应用.js:

import MyRandom from './random';
export default class App {
    get() {
        let r = new MyRandom();
        let total = r.get() * r.get(); // Complex calc goes here!
        return total;
    }
}

现在我想对app.js get进行单元测试。所以我想嘲笑MyRandom.要做这个我找到了一个非常有趣的图书馆无酒精鸡尾酒

根据文档,您应该将 my-random.js更改为

import {mock} from 'mocktail';
class MyRandom {
    get() { return Math.random(); }
}
export default mock(MyRandom);

在测试文件中,您必须告诉环境您正在测试,如下所示:

import {env, ENV, inject} from 'mocktail';
env(ENV.TESTING);
class MyRandomMock {
    get() {
        return 10; // Not so random anymore
    }
}
inject('MyRandom', MyRandomMock);

你应该能够测试app.js.不幸的是,当我尝试这个MyRandom时,从未被模拟类取代。任何帮助将不胜感激!!

我在这里在 github 上设置了一个测试项目来演示这个问题。如您所见,测试将失败:(

如果有更好的方法来实现我需要的,请告诉我!

我认为您需要在测试文件中App之前导入setup,这将注入 mock 并在 App 中调用它。

import './setup';    
import App from '../src/app';