我一直在为我的Dojo小部件创建一些测试,以检查是否正确设置了布尔标志。但是,我发现由于我已经改变了我的构造函数以传入一个对象,以前运行的测试似乎会影响后续的测试。
我已经尝试在拆卸方法中销毁小部件,但无论我做什么,价值仍然存在。
任何人都可以提出我可能做错的建议吗?
我的小部件代码:
var showControls = true;
return declare([WidgetBase, TemplatedMixin, _WidgetsInTemplateMixin], {
templateString: template,
constructor: function (params) {
this.showControls = (typeof params.showControls === "undefined" || typeof params.showControls != "boolean") ? this.showControls : params.showControls;
}
});
我的测试课程是:
var customWidget;
doh.register("Test controls", [
{
name: "Test controls are not visible when set in constructor",
runTest: function() {
var params = { showControls: false };
customWidget = new CustomWidget(params);
doh.assertFalse(customWidget.getShowControls());
}
},
{
name: "Test controls are visible when set in constructor with string instead of boolean",
runTest: function() {
var params = { showControls: "wrong" };
customWidget= new CustomWidget(params);
doh.assertTrue(customWidget.getShowControls());
}
}
]);
因此,第一个测试通过,因为showControls设置为false,但第二个测试尝试创建一个新实例,其中构造函数将检查该值是否为布尔值。然而,当我调试它时,它认为showControls以'false'开头,而不是真的。
任何线索?!
由于
答案 0 :(得分:1)
dijit/_WidgetBase
有a mechanism of mixing in constructor parameters,这就是您描述的行为的原因。其中一种可能的解决方案是将自定义设置器定义为方法_set[PropertyName]Attr
:
var defaults = {
showControls: true
}
var CustomWidget = declare([_WidgetBase, _TemplatedMixin], {
templateString: "<div></div>",
constructor: function(params) {
declare.safeMixin(this, defaults);
},
_setShowControlsAttr: function(value) {
this.showControls = (typeof value === "boolean") ? value : defaults.showControls;
}
});
答案 1 :(得分:0)
我建议您列出窗口小部件的任何成员,否则,传入构造函数的内容可能无法正确识别。看来你想使用this.showControls,所以你应该有一个showControls成员。像这样:
return declare([WidgetBase, TemplatedMixin, _WidgetsInTemplateMixin], {
templateString: template,
showControls: true, // default value
constructor: function (params) {
// no further action, params are automatically mixed in already
}
});
列出成员时要小心,dojo将数组和对象解释为类成员(如Java中的静态,AFAIK,它们附加到原型),因此如果您希望每个对象都有例如一个单独的值数组,请列出它as null并在构造函数中初始化。