簡體   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