繁体   English   中英

节点依赖性容器无法按预期工作

[英]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.jscsv-reader.jscontainer的内存引用是相同的,所以我应该能够更改container.fileReader.readFileContentscsv-reader将使用mock函数。

如果我从di-container.js删除csvReader: require("./csv-reader")行并在csv-reader.spec.js使用const csvReader = require("./csv-reader") ,那么测试经过。 这表明在创建container中的依赖项的顺序方面存在一些奇怪之处。

我已经尝试重新排列containerfileReadercsvReader的顺序,并将它们更改为像container.fileReader = ...而不是内联实例化但是没有工作.jav

您有一个依赖模块循环

你的di-container.js文件需要csv-reader.jscsv-reader.js文件需要di-container.js来形成一个循环。

因此, require("./di-container")csv-reader.js文件中返回null 因为require("./di-container")null ,所以destructured container将是未定义的。 因此,你得到了你提到的错误。

您需要重新设计您的功能,并可能想要考虑您希望将它们放在何处。


在非常广泛的层面上,只需将两个文件中使用的函数分开并将它们放在common.js

然后,在csv-reader.jsdi-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM