如何为Ajax调用编写单元测试

4

我是个JavaScript单元测试的新手。在我的单元测试中,我一直得到"AssertError: expected "ok" but was [undefined]"的结果。有人能教我如何为ajax调用做单元测试吗?谢谢。顺便说一下,我正在使用JsTestDriver来测试我的单元测试。

这是我的源文件:

function getReport(m, y)
{
$.ajax({
    url: "url/to",
    data: {
        m:m,
        y:y
    },
    dataType: 'json',
    success:function (res) {
            return res;

    }       
});

以下是我的测试文件:

TestCase("Report", {

  "test get report": function () {
 assertEquals("ok", getReport(1, 2015));
}   
});

getReport 函数没有返回值。返回值的是异步调用的成功回调函数。您使用的框架应该有一些方法来延迟断言,直到回调函数被执行。但是我无法提供更多帮助,因为我没有 JavaScript 单元测试方面的经验 :( - Diego
1个回答

4
在继续回答你的问题之前,让我问一个问题:您为什么需要测试Ajax请求?通常,单元测试不会测试供应商代码和功能,例如第三方函数、API、网络问题、数据库等。重点是对团队和您创建的代码进行单元测试。让供应商测试他们的代码。在这个特定的例子中,jQuery Ajax 应该由 jQuery 提供商测试,而不是你自己来测试。
另外一个你不应该测试Ajax的原因是,测试将从单元测试转移到集成测试,因为你测试了后端是否从服务器返回了正确的值。也就是说,你测试客户端和服务器的代码如何协同工作。
正确的方法是通过使用模拟、间谍或存根来使你的单元测试与外部调用隔离开来。如果你不确定它们是什么,请在互联网上搜索。所有流行的单元测试框架和库都支持并提供了使用它们的简单方法。
你可能仍然想要测试它,为此可以访问相关帖子:使用 QUnit 进行 AJAX 请求的单元测试 祝你单元测试好运!

4
为什么要测试Ajax请求?1. 因为端点可能会改变/中断。具有小型测试示例使得更容易调试出错原因。2. 我们最近还从代码库中去掉了jQuery,因为它对我们的使用来说太臃肿了 - 我们已经将所有东西迁移到了不含$.ajax()的本地Javascript上。这意味着我们需要验证jQuery在内部做了什么,并确保我们的本机替代方案正确地实现/模拟了API。 - Michaelangel007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接