这里有几个问题;我们可以理清你的语法,但我们也必须理清意图。
错误消息“错误:预期on
“至少被叫过一次但从未被叫过”是准确的。on
测试期间不会被调用。它仅在您的装置中调用,以设置事件处理程序。您还触发了mouseenter
事件,但你的听众是为了mouseover
and mouseout
。在现实世界中,你会得到一个mouseover
不久之后mouseenter
事件,但是当你用 jQuery 伪造它时,这不会发生。无论如何,jQuery 都不是一个入门者。见下文。
您可以尝试通过将它们从匿名函数更改为命名函数来解决此问题,如下所示:
var mouseOverHandler = function() {
d3.select(this).style('fill', '#ff0000');
};
然后将其绑定到您的path
with path.on('mouseover', mouseOverHandler)
。你认为你现在可以监视mouseOverHandler
, but 那也行不通。当你调用时你的函数将会被绑定on
,所以以后换成诗浓间谍不会有任何效果。
jQuery 触发不适用于 D3
另一个问题是你不能使用 jQuery 触发 D3 事件,因为 jQuery 事件不是 DOM 事件 https://github.com/mbostock/d3/issues/906。所以你应该将你的电话替换为$('path').mouseenter()
类似的东西document.getElementById('path_one').dispatchEvent(new MouseEvent('mouseover'));
(请注意,这正在更改“触发mouseenter
在所有路径上“到”触发mouseover
在具有 id 的元素上path_one
").
测试错误的东西
你可以通过重构来解决这个问题can用你可以监视的东西替换你的回调,但从根本上来说你正在测试错误的东西。本质上,您正在尝试为 D3 编写测试; “当我添加事件侦听器时,请确保调用该事件侦听器。”相反,您应该测试实际代码的行为:“当有人将鼠标悬停在图表上时,其颜色应该改变”。
If you really想要断言您的事件处理程序已绑定,您可以这样做:
expect(path.on('mouseover')).to.be.a('function')
但如果你想确保你的颜色改变了,你希望你的测试如下:
describe("Mouseover events", function() {
it("should update the colours when a user mouses over the paths", function () {
var oldColor = path.style('fill');
document.getElementById('path_one').dispatchEvent(new MouseEvent('mouseover'));
expect(path.style('fill')).to.not.equal(oldColor);
});
});