使用 ES Modules,我们将一些导出的函数定义为 const
,这通常是一种标准做法。然而,在单元测试期间,这些 const 函数无法进行存根化,从单元测试的角度来看似乎存在问题。例如:
import * as fs from 'fs';
import { bindNodeCallback } from 'rxjs';
import { map } from 'rxjs/operators';
// readFile :: string, string => Observable<string>
export const readFile$ = bindNodeCallback(fs.readFile);
// readJson :: string => Observable<any>
export function readJson(fileName) {
return readFile$(fileName, 'utf-8')
.pipe(map((rawFile) => JSON.parse(rawFile)));
}
现在,要对readJson进行单元测试,我通常会想要存根readFile$
函数。不幸的是,以下Sinon代码不起作用:
// Setup data - stubs / mocks
const stub = sinon.stub(myFs, 'readFile$').returns(json$);
由于Sinon只是更改引用myFs.readFile$
,原始的const
仍然指向原始函数,该函数反过来被readJson
函数调用。
有任何建议 - 如何在同一模块内真正地存根/模拟常量函数?
myFs
,那将非常有用。 - Daniel Kaplan