Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在NodeJS中模拟ES模块?_Javascript_Node.js_Ecmascript 6_Node Modules - Fatal编程技术网

Javascript 如何在NodeJS中模拟ES模块?

Javascript 如何在NodeJS中模拟ES模块?,javascript,node.js,ecmascript-6,node-modules,Javascript,Node.js,Ecmascript 6,Node Modules,假设我实现了一个模块,如下所示: import { foo } from 'dep1' export const bar = () => foo() 如何模拟dep1,以便进行单元测试bar?一种可能的方法可以使用ES模块加载程序挂钩 假设dep1包含工作代码,我们想模拟它。我将创建一个名为mymodule.mocks.mjs的文件,其中我将模拟foo: // Regular mymodule.mjs import { foo } from 'dep1' export const b

假设我实现了一个模块,如下所示:

import { foo } from 'dep1'

export const bar = () => foo()

如何模拟
dep1
,以便进行单元测试
bar

一种可能的方法可以使用ES模块加载程序挂钩

假设
dep1
包含工作代码,我们想模拟它。我将创建一个名为
mymodule.mocks.mjs的文件,其中我将模拟
foo

// Regular mymodule.mjs
import { foo } from 'dep1'

export const bar = () => foo()

现在,我们应该能够在测试运行期间请求
mymodule.mjs
时加载
mymodule.mocks.mjs

所以我们实现了
testModuleLoader.mjs
下面是一个自定义模块加载程序挂钩,它实现了
*.mocks.mjs
约定:

import { existsSync } from 'fs'
import { dirname, extname, basename, join } from 'path'
import { parse } from 'url'

// The 'specifier' is the name or path that we provide
// when we import a module (i.e. import { x } from '[[specifier]]')
export function resolve (
   specifier,
   parentModuleURL,
   defaultResolver
) {
   // For built-ins
   if ( !parentModuleURL )
      return defaultResolver ( specifier, parentModuleURL )

   // If the specifier has no extension we provide the
   // Michael Jackson extension as the default one
   const moduleExt = extname ( specifier ) || '.mjs'
   const moduleDir = dirname ( specifier )
   const { pathname: parentModulePath } = parse (
      parentModuleURL
   )
   const fileName = basename ( specifier, moduleExt )

   // We build the possible mocks' module file path
   const mockFilePath = join (
      dirname ( parentModulePath ),
      moduleDir,
      `${fileName}.mocks${moduleExt}`
   )

   // If there's a file which ends with '.mocks.mjs'
   // we resolve that module instead of the regular one
   if ( existsSync ( mockFilePath ) )
      return defaultResolver ( mockFilePath, parentModuleURL )

   return defaultResolver ( specifier, parentModuleURL )
}
使用它 只需将其提供给
节点

node --experimental-modules --loader ./path/to/testModuleLoader.mjs ./path/to/app.mjs
关于ES模块加载程序挂钩

node --experimental-modules --loader ./path/to/testModuleLoader.mjs ./path/to/app.mjs