我有两个相互影响的测试.我明白为什么我正在替换在第二个测试中被内部调用的jQuery内置函数.然而,我不明白为什么测试交替通过并失败.

This question is similar但是,我没有直接在qunit-fixture div上做任何事情.

这是我的测试

test('always passing test',function() { // Always passes
    var panelId = '#PanelMyTab';

    var event = {};
    var ui = {
        tab: {
            name: 'MyTab',},panel: panelId,};

    $('<div id="' + panelId + '">')
        .append('<a href="#" class="export">Test</a>')
        .append('<a href="#" class="showForm">Show Form</a>')
        .appendTo('#qunit-fixture');

    jQuery.fn.on = function(event,callback) {
        ok(this.selector == panelId + ' .export','Setting export click event');
        equal(callback,tickets.search.getReport,'Callback being set');
    };

    loadTab(event,ui);
});

test('alternately passing and failing',function() { // Alternates between passing and failing on page refresh
    expect(5);

    var testUrl = 'test';
    $('<div class="ui-tabs-panel">')
        .append('<a href="'+ testUrl + '" id="getReport">Get Report</a>')
        .append('<form action="notest" target="" class="ticketSearch"></form>')
        .appendTo('#qunit-fixture');

    // Setup form mocking
    $('form.ticketSearch').submit(function() {
        var urlPattern = new RegExp(testUrl + '$');
        ok(urlPattern.test($(this).prop('action')),'Form action set to link href');
        equal($(this).prop('target'),'_blank','Open form on a new page');
    });

    var event = {
        target: 'a#getReport',};

    var result = getReport(event);

    var form = $('form.ticketSearch');

    ok(/notest$/.test($(form).prop('action')),'Making sure action is not replaced');
    equal($(form).prop('target'),'','Making sure that target is not replaced');

    ok(false === result,'click event returns false to not refresh page');
});

测试将从通过开始,但是当我刷新时,它们将在通过和失败之间交替.

为什么会发生这种情况?甚至在URL中添加GET参数会导致页面上的相同行为.

在失败的情况下,测试失败,因为内部jQuery在设置了submit()处理程序时正在调用.on().但是为什么在这种情况下测试总是不会失败?在页面刷新期间保持状态的浏览器是什么?

更新:

以下是正在测试的代码:

var tickets = function() {
    var self = {
        loadTab: function(event,ui) {
            $(panel).find('.export').button().on('click',this.getReport);
        },search: {
            getReport: function(event) {
                var button = event.target;
                var form = $(button).closest('div.ui-tabs-panel').find('form.ticketSearch').clone(true);

                $(form).prop('action',$(button).prop('href'));
                $(form).prop('target','_blank');

                $(form).submit();

                return false;
            }
        }
    };

    return self;
}();

解决方法

我修改了@ Ben的 fiddle,将您的代码包含在两个测试中.我修改了一些代码,使其正常运行.当你点击运行按钮,所有的测试都会通过.当您再次按下运行按钮时,第二个测试(“交替传递和失败”)将失败 – 这基本上是模拟您的原始问题.

问题是您的第一个测试(“always passing test”)通过用重写的替换jQuery.fn.on函数来改变全局状态.因此,当测试按顺序运行时,第二个测试(“交替传递和失败”)使用不正确的覆盖jQuery.fn.on函数并失败.每个单元测试应将全局状态恢复到其预测状态,以便其他测试可以基于相同的假设运行.

在通过和失败之间交替的原因是,在引擎盖下,QUnit始终首先运行失败的测试(它通过cookie或本地存储记住这一点,我不完全确定).首先运行失败的测试时,第二个测试运行在第一个测试之前;因此,第二个测试获取jQuery的本机功能和工作.当您第三次运行它时,测试将以“原始”顺序运行,第二个测试将使用覆盖的功能并失败.

这是fiddle的工作.我通过缓存原始的var jQueryOn = jQuery.fn.on添加了测试后的“un-override”on函数的修复.在测试结束时通过以下功能重新设置它:jQuery.fn.on = jQueryOn ;.您可以更好地使用QUnit的模块teardown()方法来实现.

您可以查看https://github.com/jquery/qunit/issues/74了解更多信息.

javascript – Qunit测试在页面刷新之间交替通过和失败的更多相关文章

  1. Html5 滚动穿透的方法

    这篇文章主要介绍了Html5 滚动穿透的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. HTML5 拖放(Drag 和 Drop)详解与实例代码

    本篇文章主要介绍了HTML5 拖放(Drag 和 Drop)详解与实例代码,具有一定的参考价值,有兴趣的可以了解一下

  3. 跨域修改iframe页面内容详解

    这篇文章主要介绍了跨域修改iframe页面内容详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  5. ios – 暂停调度队列是否会暂停其目标队列?

    我想创建两个串行队列A&B.队列B是队列A的目标.我想在B上排队一些块,并暂停它直到我准备执行它们,但是我想继续在队列A上执行块.如果我暂停B,这还会暂停它的目标队列(队列A)吗?我的想法是,我想安排这些特定的块在稍后日期执行但是我不希望它们同时运行而我不这样做想要处理信号量.但我希望队列A继续处理它的块,而B则被暂停如果不清楚这里是一些示例代码解决方法queueB被挂起,但queueA未被挂起.queueA和queueB被挂起.

  6. ios – 使用CocoaPods post install hook将自定义路径添加到HEADER_SEARCH_PATHS

    解决方法在Podfile中定义一个方法:然后在post_install中调用该方法:

  7. ios – 在Swift中删除WKWebView Accesory栏

    我现在正试着将this转换成Swift而没有真正的背景.这是我到目前为止所得到的…而且我一直在寻找谷歌并不知道要搜索什么才能更具体.你能否详细说明我做错了什么?

  8. iOS,ld:framework没有找到适用于架构arm64的GoogleMaps

    Podfile看起来像这个Cocoapodsv1.0beta6):解决方法更新请检查您是否在架构中具有相同的构建设置,并仅构建活动体系结构中的目标键你的podfile应该是这样的在您启动ProjectTest目标之前结束项目目标,也是为什么添加继承!

  9. ios – 为CocoaPods的pod设置部署目标

    我使用CocoaPods来管理项目中的依赖关系.我写了Podfile:此文件与CocoaPods0.x配合使用,但在我更新到CocoaPods1.0之后,我无法编译项目.运行后我无法编译我的项目错误:/Users/

  10. ios – 如何在故事板上单击UIImageView(swift)

    我是新来的,我想知道如何在故事板上单击ImageView.我想要做的是使其点击时,它显示另一个视图控制器.解决方法您可以添加tapGesture.这是代码:Swift3.0

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部