我如何对使用REST API的JS进行单元测试?

时间:2013-07-16 22:18:05

标签: jquery rest qunit sinon

所以这是交易:我在mypage.html中有一个iframe。使用jQuery,我查看http://mysite.com/rest/foo(一个公开的REST服务)并获取一个包含url的XML响应。我将iframe的src属性设置为该网址。

现在的问题是,我将如何对此进行单元测试(使用QUnitSinon.js)?我对一般的单元测试非常陌生,所以我想听一些更有经验的观点和例子。

的script.js:

$(document).ready(function() {

    function setUrl(url) 
    {
        $('iframe').attr('src', url);
    }

    function throwError() 
    {
        // Error handling
    }   

    function myCallback(response) 
    {
        var url = $(response).find("url");

        if (!url.text()) throwError();
        else setUrl(url.text());
    }

    function bar(restLocation, callback) 
    {       
        $.get("http://mysite.com/rest/" + restLocation, callback);
    }

    bar("foo", myCallback);
});

特别是,我想知道以下事情:

  1. 我猜我需要将所有这些函数暴露给全局命名空间才能测试它们。这是绝对必要的,还是有办法在document.ready()函数中测试它们?

  2. 我应该测试哪些功能? bar()实际上只做一件事:对/ rest / foo /进行AJAX调用然后调用myCallback,而其他人是辅助方法(如果我用Java或C#编写它们,他们可能会是私人的......我也应该测试一下吗?最终用户(正在查看mypage.html的用户)在技术上甚至无法选择指向哪个REST地址。

  3. 我想一些合适的测试用例可能是

    • 如果将有效的restLocation传递给bar(),则应设置iframe src。
    • 如果传递了无效的restLocation,则必须处理错误(以加载404或其他形式的方式)
    • 如果服务器已关闭,请处理错误。
    • 还有别的吗?
  4. 不幸的是,如果我尝试$('iframe').attr('src'),它会返回undefined。如果我尝试使用prop(),我会得到一个空字符串。我如何检查src是否设置正确?

    很抱歉这个问题很长。我对于什么样的测试进行“好”单元测试以及如何在这种情况下测试事物感到非常困惑。

1 个答案:

答案 0 :(得分:0)

首先,您应该将传递到read函数的函数放入命名函数中,这样就可以像这样调用它

$(document).ready(myFunction)

现在,您可以将myFunction调用到测试中,而无需模拟$.ready函数。

测试将如下所示:

test( sets the iFrameUrl", function() {
  var server = sinon.fakeServer.create();
  server.respondWith('responseUrl');
  server.autoRespond = true;
  $('body').append('iframe')
  myFunction();
  equal($('iframe').attr('src'), 'responseUrl', 'iframe url')
})