首页 > 解决方案 > 如何在不先导入依赖项的情况下模拟依赖项?

问题描述

让我们看3个文件:

sut.js

import dep from './dep';

export function foo() {
  /* Do some stuff */
  dep();
  /* Do some more stuff */
}

dep.js

import SomeWebWorker from 'worker-loader!./worker'; // WebPack loader that loads the file as a webworker. The file exists.

export default () => {
  /* Do something with `SomeWebWorker` */
};

test.js

import sinon from 'sinon';
import {foo} from './sut';
import dep from './dep';

describe('sut', () => {
  afterEach(() => { sinon.restore() });

  it('Calls ServiceWorker', () => {
    const swStub = sinon.stub(dep);
    foo();
    assert.ok(swStub.called);
  });
});

我希望测试能够成功运行并完成,因为foo调用dep.

但是,我得到一个错误:

错误:找不到模块 'worker-loader!./worker'

我认为这是因为我调用的方式mocha是这样的:

cross-env TS_NODE_PROJECT=\"./test.tsconfig.json\" mocha **/*test.{js,ts}

哪里.mocharc.json是这样的:

{
  "require": ["ts-node/register", "global-jsdom/register"],
  "exit": true
}

所以在那个上下文中没有 Webpack,因此它阻塞了 Webpack内联加载器语法。

如果是这种情况,那么如果我们根本不加载 'worker-loader!./worker' 而是 stub/mock 它应该可以解决。但是怎么做?

标签: javascriptwebpackmockingmocha.jssinon

解决方案


推荐阅读