[英]Node dependency container doesn't work as expected
我有一个像这样的DI容器:
# di-container.js
const container = {
fileReader: require("./file-reader"),
csvReader: require("./csv-reader"),
}
module.exports = {
container
}
而csv-reader.js
看起来像这样:
# csv-reader.js
const { container } = require("./di-container")
async function readFileAsCSV(path)
const fileContents = await container.fileReader.readFileContents(path)
return fileContents.split("\n")
.map(line => line.split(","))
}
我有一个测试文件csv-reader.spec.js
:
# csv-reader.spec.js
const { container } = require("./di-container")
describe("csvReader", () => {
it("should read cells from file", async () => {
const fakeCSV = "\"Name\",\"Age\"\n\"Bob Smith\",\"32\""
container.fileReader.readFileContents = (_) => fakeCSV
const result = container.csvReader.readFileAsCSV()
# Do some assertions...
})
})
运行测试时,它会因错误而失败(堆栈跟踪行号不同,因为示例略有不同):
TypeError: Cannot read property 'fileReader' of undefined
at Object.readFileAsCSV (csv-reader.js:8:42)
at Context.it (csv-reader.spec.js:15:44)
at processImmediate (internal/timers.js:443:21)
我期望在csv-reader.spec.js
和csv-reader.js
对container
的内存引用是相同的,所以我应该能够更改container.fileReader.readFileContents
和csv-reader
将使用mock函数。
如果我从di-container.js
删除csvReader: require("./csv-reader")
行并在csv-reader.spec.js
使用const csvReader = require("./csv-reader")
,那么测试经过。 这表明在创建container
中的依赖项的顺序方面存在一些奇怪之处。
我已经尝试重新排列container
的fileReader
和csvReader
的顺序,并将它们更改为像container.fileReader = ...
而不是内联实例化但是没有工作.jav
您有一个依赖模块循环 。
你的di-container.js
文件需要csv-reader.js
和csv-reader.js
文件需要di-container.js
来形成一个循环。
因此, require("./di-container")
在csv-reader.js
文件中返回null
。 因为require("./di-container")
为null
,所以destructured container
将是未定义的。 因此,你得到了你提到的错误。
您需要重新设计您的功能,并可能想要考虑您希望将它们放在何处。
在非常广泛的层面上,只需将两个文件中使用的函数分开并将它们放在common.js
然后,在csv-reader.js
和di-container.js
common.js
如果我从di-container.js中删除csvReader:require(“./ csv-reader”)行并在csv-reader.spec.js中使用const csvReader = require(“./ csv-reader”),那么测试经过。 这表明在创建容器中的依赖项的顺序方面存在一些奇怪之处。
一旦你不需要来自di-container.js
csv-reader.js
破坏循环,因此它工作得很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.