所以这是交易:我在mypage.html中有一个iframe
。使用jQuery,我查看http://mysite.com/rest/foo
(一个公开的REST服务)并获取一个包含url的XML响应。我将iframe的src
属性设置为该网址。
现在的问题是,我将如何对此进行单元测试(使用QUnit和Sinon.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);
});
特别是,我想知道以下事情:
我猜我需要将所有这些函数暴露给全局命名空间才能测试它们。这是绝对必要的,还是有办法在document.ready()
函数中测试它们?
我应该测试哪些功能? bar()
实际上只做一件事:对/ rest / foo /进行AJAX调用然后调用myCallback
,而其他人是辅助方法(如果我用Java或C#编写它们,他们可能会是私人的......我也应该测试一下吗?最终用户(正在查看mypage.html的用户)在技术上甚至无法选择指向哪个REST地址。
我想一些合适的测试用例可能是
bar()
,则应设置iframe src。不幸的是,如果我尝试$('iframe').attr('src')
,它会返回undefined
。如果我尝试使用prop()
,我会得到一个空字符串。我如何检查src
是否设置正确?
很抱歉这个问题很长。我对于什么样的测试进行“好”单元测试以及如何在这种情况下测试事物感到非常困惑。
答案 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')
})