【发布时间】:2015-11-12 20:55:53
【问题描述】:
我刚刚开始使用 QUnit 进行 ui 测试,所以我确定我错过了 qunit-fixture 的一些基本用例。我认为它对测试 DOM 操作很有用,但后来我意识到我的 DOM 操作函数都不知道关于 qunit-fixture 的任何事情(也不应该?)。
例子:
<div id="container">
<form id="my-form">
<input type="hidden" name="field1" id="field1">
<input type="hidden" name="field2" id="field2">
</form>
</div>
<div id="qunit-fixture"></div>
我将 URL 参数传递给一个函数以填充此表单。如果这些参数不存在,我希望删除该字段,以便JQuery.serialize() 不会捆绑一个空字段。
function populate(params){
if( params.field1 ){
$("#field1").val(params.field1);
} else {
$("#field1").remove();
}
if( params.field2 ){
$("#field2").val(params.field2);
} else {
$("#field2").remove();
}
}
我最初的想法是“哦,酷。我可以使用qunit-fixture 反复模拟我的表单!”像这样:
QUnit.test("populate - field1=text", function(assert){
$("#qunit-fixture").html($("#container").html());
populate( {field1: "text"} );
assert.deepEqual($("#field1").val(), "text");
assert.deepEqual($("#field2").val(), undefined);
});
QUnit.test("populate - field1="text", function(assert){
$("#qunit-fixture").html($("#container").html());
populate( {field1: "text", field2: "text"} );
assert.deepEqual($("#field1").val(), "text");
assert.deepEqual($("#field2").val(), "text");
});
这当然会失败,因为第一个测试对 populate() 的调用会改变 DOM 并从页面的主窗体中删除 #field2 以及放入 qunit-fixture 的副本(非唯一 ID .. yikes )。
那么我错过了什么?我真的很喜欢使用 QUnit 测试逻辑模块的能力,并且终于开始看到更多测试驱动的开发风格的优点。我也希望能够测试我的 DOM 操作。
注意:这是一个简化的示例。我的项目中实际的 DOM 操作要复杂得多,因此需要对其进行测试。
【问题讨论】:
-
您是否考虑过在 qunit-fixture 中放置一个 iframe,它将隔离测试环境和支持代码。
标签: javascript unit-testing qunit