У меня есть 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)
Я ожидал, что ссылка на память container
одинакова в csv-reader.spec.js
и csv-reader.js
, поэтому я смогу изменить container.fileReader.readFileContents
, и csv-reader
будет использовать функцию макета.
Если я удаляю строку csvReader: require("./csv-reader")
из di-container.js
и использую const csvReader = require("./csv-reader")
в csv-reader.spec.js
, то тест проходит успешно. Это предполагает некоторую странность с порядком, в котором создаются зависимости в container
.
Я попытался изменить порядок fileReader
и csvReader
в container
и изменить их на container.fileReader = ...
вместо встроенного экземпляра, но это не сработало. Jav