【问题标题】:Mock ES6 dependencies when unit testing单元测试时模拟 ES6 依赖项
【发布时间】:2023-03-13 23:59:01
【问题描述】:

假设有以下两个 ES6 类:

my-random.js:

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

app.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。为此我发现了一个非常有趣的库Mocktail

根据文档,您应该将 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 here 上设置了一个测试项目来演示这个问题。如您所见,测试将失败:(

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

【问题讨论】:

    标签: javascript unit-testing ecmascript-6


    【解决方案1】:

    我认为您需要在测试文件中在App 之前导入setup,这将注入模拟并使其在应用程序中调用。

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

    【讨论】:

      猜你喜欢
      • 2019-12-14
      • 1970-01-01
      • 2016-02-19
      • 2015-02-04
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 2014-07-01
      相关资源
      最近更新 更多