0

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

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

脚本.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之类的形式)
    • 如果服务器关闭,则处理错误。
    • 还要别的吗?

不幸的是,如果我尝试这样做$('iframe').attr('src'),它会返回undefined。如果我尝试使用prop(),我会得到一个空字符串。我将如何检查是否src已正确设置?

对不起,很长的问题。我对什么样的测试才能成为“好”的单元测试以及在这种情况下如何测试事物感到有些困惑。

4

1 回答 1

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')
})
于 2013-07-18T13:46:05.327 回答