首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有for循环的asyncTest

使用带有for循环的asyncTest
EN

Stack Overflow用户
提问于 2012-08-02 14:02:59
回答 1查看 847关注 0票数 0

这个职位中,我询问如何与qUnit检查是否正确加载了图像。解决方案是使用asyncTest,因为error事件处理程序是异步的。

现在,我试图通过将多个URLs与一个for循环结合起来,重新使用这段代码来检查多个for,但这并不顺利。

第一次尝试:for asyncTest内部的循环

代码语言:javascript
复制
//stop(); // no difference
asyncTest('image',function() {
    //stop(); // no difference
    var urls = ['a','b'];
    for (var i in urls) {
        //stop(); // no difference
        var url = urls[i];
        var test_image = $('#test-image');
        test_image.error(function(e) {         
            ok(false,'Issue loading image '+url);
            start();
        });
        test_image.load(function() {       
            ok(true,'Image properly loaded '+url);
            start();
        });
        //stop(); // no difference
        test_image.attr('src',url);
    }
});

结果:1次测试包含4个相同的断言(在最后一个url上)

第二次尝试:asyncTestfor循环中

代码语言:javascript
复制
var urls = ['c','d'];
for (var i in urls) {
    var url = urls[i];
    //stop(); // no difference
    asyncTest('image-'+url,function() {
        var test_image = $('#test-image');
        test_image.error(function(e) {
            console.log('ERROR',$(this).attr('src'));               
            ok(false,'Issue loading image '+url);
            start();
        });
        test_image.load(function() {
            console.log('OK',$(this).attr('src'));  
            ok(true,'Image properly loaded '+url);
            start();
        });
        //stop(); // prevents tests from running
        test_image.attr('src',url);
    });
}

结果:两个单独的测试,首先有一个断言,最后有与for循环中的迭代一样多的断言,并且始终只检查最后一个url。

asyncTest 如何将与for循环组合起来,以便每次迭代时有一个test+assertion (用于断言的迭代值)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-02 14:27:14

之所以会发生这种情况,是因为JavaScript有一个名为闭包的东西,它使与.load()关联的每个回调的var url = urls[i];更改值,从而使您的错误报告了一个不正确的URL。

要处理闭包,您可以创建一个匿名函数,然后立即执行它。一个更好的解决方案可能是创建一个单独的函数,在该函数中,您可以将URL作为参数传递,并且它将对每个图像分别进行测试。

我想您也不需要在页面上实际显示图像,而是检查我们是否能够加载它。因此,我们可以在代码中创建动态映像,而不是将它们应用于任何元素。

下面是一个有用的代码:http://jsfiddle.net/VesQ/JWBhD/1/

代码语言:javascript
复制
var urls = ['http://jquery.com/favicon.ico','http://vesq.net/favicon.ico', 'http://example.com/thisDoesNotExist.jpg'];
test('image', urls.length, function() {
    for (var i = 0; i < urls.length; i++) {
        var url = urls[i];
        stop();
        imageAsyncTest(url);
    }
});

function imageAsyncTest(url) {
    // Create a new dynamic image
    var img = new Image();

    // Turn it into a jQuery object
    var $img = $(img);

    // Hook the tests
    $img.error(function() {         
        ok(false,'Issue loading image '+url);
        start();
    });
    $img.load(function() {       
        ok(true,'Image properly loaded '+url);
        start();
    });

    // Load the image
    $img.attr('src', url);
}

编辑:原谅我,没有读到你问题底部的粗体部分。我很快就会编辑这段代码。

EDIT2: Ok,在进一步研究了QUnit API之后,我认为asyncTest中的第二个参数,称为expected,是一个数字,说明应该有多少断言检查。所以我想代码现在应该能正常工作了。

EDIT3: Ok,现在我可以测试它了,我发现asyncTest()毕竟不是我们所需要的。我们应该将test()stop()start()结合起来,将它们合并到一个测试中。我创建了一个工作小提琴并更新了代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11779096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档