[英]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.