Javascript 如何使用sinon模拟d3.select.selectall?
我需要测试以下代码:Javascript 如何使用sinon模拟d3.select.selectall?,javascript,d3.js,sinon,Javascript,D3.js,Sinon,我需要测试以下代码: window.d3.select(id).selectAll("text").attr("font-family", "FontAwesome"); var textsSelected = window.d3.select(id).selectAll('text'); var filtered = textsSelected.filter(function(value, index, arr) { return !((value===undefined)||(
window.d3.select(id).selectAll("text").attr("font-family", "FontAwesome");
var textsSelected = window.d3.select(id).selectAll('text');
var filtered = textsSelected.filter(function(value, index, arr) {
return !((value===undefined)||(typeof (value) === "number"));
});
我正在努力模仿它,这样两行都可以运行,而不会因为错误而崩溃
目前我有
var texts = {
_group:[
[{id: "textID2#StatusChangeChart",
textContent: " New",
__data__: "hi"
}]
],
fontFamily: "shouldChange",
__proto__:{
attr: function (name, value) {
if (name === 'font-family') {
// this works
this.fontFamily = value;
}
}
}
};
var d3Select = sinon.stub(window.d3,'select');
d3Select.withArgs("#testUpdateImage").returns({
selectAll: function (e) {
var objectToReturn = imageUpdateGroups;
switch (e) {
//stuff here
case "text":
objectToReturn = texts;
//TODO
break;
//stuff here
}
return objectToReturn;
}
});
作为嘲弄
我得到一个错误TypeError:array.filter不是一个函数
,我的console.log语句显示attr确实发生了应该发生的变化
选择的文本应该是什么
键入window.d3.select('PhaseChangeChart')。selectAll('text')代码>进入控制台返回(组已展开以便于查看):
每个文本都是一个文本元素。临时答案,直到有人有更好的答案(不涉及模仿过滤器的答案)
向\uuuu proto\uuuu
添加一个过滤函数将停止错误
var toFilter =[
{
0: [
{
id: "textID2#StatusChangeChart",
textContent: "New",
__data__: "hi"
}
]
}
];
var texts = {
_group: toFilter,
fontFamily: "shouldChange",
__proto__:{
attr: function (name, value) {
if (name === 'font-family') {
this.fontFamily = value;
}
},
filter: function (value, index,arr){
return {_groups:[undefined]};
}
}
};
就我个人而言,我需要更改undefined
,以实际返回我可以更改的样式的内容,以便对我正在测试的函数的其余部分进行测试,从而测试该函数的实际功能。但是,如果有人想知道将来如何解决这个问题,只需添加自己的函数,而不是使用预先制作的库函数。您没有测试它们的功能。你在测试你的。让它返回您希望它返回的内容,并查看您的函数是否支持您希望它支持的数据。临时答案,直到有人有更好的答案(不涉及模拟过滤器的答案)
向\uuuu proto\uuuu
添加一个过滤函数将停止错误
var toFilter =[
{
0: [
{
id: "textID2#StatusChangeChart",
textContent: "New",
__data__: "hi"
}
]
}
];
var texts = {
_group: toFilter,
fontFamily: "shouldChange",
__proto__:{
attr: function (name, value) {
if (name === 'font-family') {
this.fontFamily = value;
}
},
filter: function (value, index,arr){
return {_groups:[undefined]};
}
}
};
就我个人而言,我需要更改undefined
,以实际返回我可以更改的样式的内容,以便对我正在测试的函数的其余部分进行测试,从而测试该函数的实际功能。但是,如果有人想知道将来如何解决这个问题,只需添加自己的函数,而不是使用预先制作的库函数。您没有测试它们的功能。你在测试你的。让它返回您希望它返回的内容,并查看您的函数是否支持您希望它支持的数据。检查数组是否为jsarray@Rishab结果证明这个名字非常容易让人误解。运行实际代码(不是我的测试):typeof(array)返回对象。isArray(数组)返回false。所以它甚至不应该是我嘲笑的数组。混淆过滤器的工作原理,但在我不进行测试时确实如此。更新:更改变量名称更新:描述了所选文本应该包含的内容添加了临时答案,但如果有更好的答案,请告诉我。我不希望模拟过滤器检查数组是否为jsarray@Rishab结果证明这个名字非常容易让人误解。运行实际代码(不是我的测试):typeof(array)返回对象。isArray(数组)返回false。所以它甚至不应该是我嘲笑的数组。混淆过滤器的工作原理,但在我不进行测试时确实如此。更新:更改变量名称更新:描述了所选文本应该包含的内容添加了临时答案,但如果有更好的答案,请告诉我。我不想模拟过滤器当然,模拟过滤器感觉是我以测试的名义做过的最糟糕的事情之一,因为我确实关心过滤器在我不测试时返回正确的东西,但我只能假设它是正确的,因为在我不测试时函数工作正常。当然,模拟过滤器感觉像是我以测试的名义做过的最糟糕的事情之一,因为我确实关心过滤器在我不测试它时返回正确的东西,但我只能假设它会返回正确的东西,因为在我不测试时函数正常工作。