#javascript #d3.js #jestjs #jsdom
#javascript #d3.js #jestjs #jsdom
Вопрос:
Добавление d3.drag() вызывает ошибку при тестировании события mousedown jest
через jsdom
среду in.
function App() {
const array = [1];
React.useEffect(() => {
d3.select(".App")
.style("outline", "none")
.append("svg")
.attr("width", "400px")
.attr("height", "500px");
d3.select('svg')
.selectAll('g')
.data(array)
.join(
enter => {
return enter
.append('text')
.attr('x', 100)
.attr('y', 100)
.attr('fill', '#000')
.text('hello');
}
)
.call(d3.drag().on("start", () => {
console.log("dragStart");
}));
}, []);
return (
<div className="App">
</div>
);
}
const wrapper = TestingLibraryReact.render(<App/>);
const circle = wrapper.container.querySelector('svg').querySelector("text");
TestingLibraryReact.fireEvent.mouseDown(circle);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.2.0/d3.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom-test-utils.development.js"></script>
<script src="https://unpkg.com/@testing-library/react@11.2.2/dist/@testing-library/react.umd.js"></script>
Ошибка:
Error: Uncaught [TypeError: Cannot read property 'document' of null]
at reportException (C:MyFilesworkspaced3-bugnode_modulesjsdomlibjsdomlivinghelpersruntime-script-errors.js:66:24)
at invokeEventListeners (C:MyFilesworkspaced3-bugnode_modulesjsdomlibjsdomlivingeventsEventTarget-impl.js:209:9)
at SVGElementImpl._dispatch (C:MyFilesworkspaced3-bugnode_modulesjsdomlibjsdomlivingeventsEventTarget-impl.js:119:9)
at SVGElementImpl.dispatchEvent (C:MyFilesworkspaced3-bugnode_modulesjsdomlibjsdomlivingeventsEventTarget-impl.js:82:17)
at SVGElement.dispatchEvent (C:MyFilesworkspaced3-bugnode_modulesjsdomlibjsdomlivinggeneratedEventTarget.js:157:21)
at C:MyFilesworkspaced3-bugnode_modules@testing-librarydomdistevents.js:25:20
Вот полный пример:
d3-bug.zip
Ответ №1:
Ошибка, которую вы получаете при использовании не уменьшенной версии d3, такова view is undefined
. Это связано с тем, что d3 ожидает присутствия некоторого пользовательского атрибута view
, который вы не можете добавить через библиотеку тестирования, поскольку его нет в списке кураторских событий. Однако вы можете просто использовать ванильный JavaScript для этого, если хотите:
function App() {
const array = [1];
React.useEffect(() => {
d3.select(".App")
.style("outline", "none")
.append("svg")
.attr("width", "400px")
.attr("height", "500px");
d3.select('svg')
.selectAll('g')
.data(array)
.join(
enter => {
return enter
.append('text')
.attr('x', 100)
.attr('y', 100)
.attr('fill', '#000')
.text('hello');
}
)
.call(d3.drag().on("start", () => {
console.log("dragStart");
}));
}, []);
return (
<div className="App">
</div>
);
}
const wrapper = TestingLibraryReact.render(<App/>);
const circle = wrapper.container.querySelector('svg').querySelector("text");
circle.dispatchEvent(new MouseEvent("mousedown", {
view: window,
}));
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.2.0/d3.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom-test-utils.development.js"></script>
<script src="https://unpkg.com/@testing-library/react@11.2.2/dist/@testing-library/react.umd.js"></script>
Комментарии:
1. Это решило мою проблему. Знаете ли вы какой-либо ресурс или что-то, что объясняет события javascript?
2. Для ванильного JavaScript в целом я рекомендую MDN. Они более современные и более подробные, чем W3Schools. Кроме этого, боюсь, я не могу придумать ничего неожиданного