我有一个网站,它的客户端使用JS,后端使用PHP,并支持MySQL数据库。我开始对所有内容进行单元测试,后端使用PHPUnit非常简单。
本着同样的精神,我想开始测试客户端,并选择了QUnit。然而,我们使用的是Kendo UI,我有点不知道如何在不重新设计轮子的情况下实现测试自动化。
假设我有一个modify.js
文件,在我定义了所有内容后,我有以下jQuery:
$(document).ready(function() {
$("#user-menu").kendoMenu();
var modify = $('#modify');
kendo.bind(modify, modifyViewModel);
kendo.bind($('#numTagWindow'), numTagWindow);
modifyViewModel.initForm();
$(window).on("resize", function() {
kendo.resize($("#trip"));
});
});
这里,modify.php
是一个带有一些PHP的html文件,对应于用户在修改相应设置时获得的视图。在modify.php
中包含的一个单独的jsTest.js
文件中,我有所有与modify.js
相关的QUnit测试。
我的问题如下:这里的单元测试的标准方法是什么,自动化的还是其他的?目前,由于相同的HTML页面正在用于许多测试,我目前唯一的选择是手动尝试每个选项,看看断言是否通过。
在所述函数取决于预先选择的输入类型的情况下,情况会变得更糟。我不得不根据输入放置不同数量的预期断言(诚然,这可能是一个设计缺陷)。
我应该如何处理?是否可以使用多个$(document).ready
"重置"页面并以这种方式运行测试?在这种情况下,向客户端代码提供用户输入的最简单方法是什么?
我以前从未用KendoUI测试过应用程序,但我认为它与任何其他前端库都类似。。。也就是说,您可以使用他们拥有的任何内置工具,模拟库,或者进行更多的"集成"测试,而不是单元测试。对于你上面的最简单的例子来说,嘲笑并没有那么糟糕,但你可以想象它会失控。因此,我认为集成测试是最好的,您可以使用QUnit(与jQuery一起),只需"编写"您正在测试的所有操作。
当然,您还需要有一些策略,通过重置HTML块,或者将不同的块分离到不同的测试文件中,或者其他一些方法来使测试成为原子。。。
下面是一个QUnit测试文件的超级基本示例,其中包含一个html fixture,每次测试后都会重置它。请注意,通过在源代码中使用document.ready()
调用,您基本上否定了执行这些操作的能力。如果去掉这一点,使用某种init()
方法,效果会更好。
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="lib/qunit-1.14.0.css" />
</head>
<body>
<div id="qunit"></div> <!-- required! -->
<div id="qunit-fixture">
<!-- HTML to be reset for each test -->
<div id="user-menu"> <!-- whatever you need in here --> </div>
<!-- whatever other HTML you need for these tests -->
</div>
<script src="lib/qunit-1.14.0.js"></script>
<script src="path/to/source-code.js"></script>
<script>
QUnit.test("Test some trigger", function(assert) {
myCode.init(); // used to be in your document.ready()
$("#someTriggerButton").click();
assert.ok($("#someElement").hasClass("foobar"), "Ensure the element has the correct class after clicking trigger");
});
// Note that after this test runs, before the next test runs,
// the HTML inside of #qunit-fixture will be reset to its value when freshly loaded
QUnit.test("Another test", function(assert) {
// ...
});
</script>
</body>
</html>
所以有一些事情要从。。。这是用于HTML片段,而不是整个页面。当然,还有很多其他的做事方式。不幸的是,你的问题有点过于模糊,无法真正给你一个具体的"解决方案"。如果你尝试了一些东西,但遇到了问题,请在这里发布另一个问题,我们会尽力提供帮助。