我有两个测试相互引起副作用.我理解为什么我要替换在第二次测试中内部调用的jQuery内置函数.然而,我不明白为什么测试交替通过和失败.
这个问题很相似但是,我没有直接在qunit-fixture div上做任何事情.
这是我的测试
test('always passing test', function() { // Always passes var panelId = '#PanelMyTab'; var event = {}; var ui = { tab: { name: 'MyTab', }, panel: panelId, }; $('') .append('Test') .append('Show Form') .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'; $('') .append('Get Report') .append('') .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'); });测试将从传递开始,但是当我刷新时,它们将在传递和失败之间交替.
为什么会这样?即使向网址添加GET参数,也会在网页上产生相同的行为.
在失败的情况下,测试失败,因为内部jQuery
.on()
在设置submit()
处理程序时调用.但是为什么在这种情况下测试总是失败?在页面刷新期间保留状态的浏览器是什么?更新:
以下是正在测试的代码:
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; }();
DragonDTG.. 6
我修改了@ Ben的小提琴,将你的代码包含在你的两个测试中.我修改了一些代码以使其正确运行.当您点击运行按钮时,所有测试都将通过.再次点击运行按钮时,第二次测试("交替传递和失败")将失败 - 这基本上模拟了您的原始问题.
问题是你的第一个测试("总是通过测试")通过用重写函数替换函数来改变全局状态
jQuery.fn.on
.因此,当测试按顺序运行时,第二个测试("交替传递和失败")使用不正确的重写jQuery.fn.on
函数并失败.每个单元测试应该将全局状态返回到其测试前状态,以便其他测试可以基于相同的假设运行.它在pass和fail之间交替的原因是在引擎盖下QUnit总是首先运行失败的测试(它通过cookie或本地存储以某种方式记住它,我不完全确定).当它首先运行失败的测试时,第二个测试在第一个测试之前运行; 因此,第二个测试获得jQuery的本机
on
功能并且有效.当您第三次运行它时,测试将以其"原始"顺序运行,第二个测试将使用被覆盖的on
功能并失败.这是工作小提琴.我
on
通过缓存原始var jQueryOn = jQuery.fn.on;
函数并在测试结束时通过以下方式重置测试,在测试后添加修复程序以"取消覆盖"该函数:jQuery.fn.on = jQueryOn;
.您可以使用QUnit的模块teardown()
方法更好地实现它.您可以查看https://github.com/jquery/qunit/issues/74了解更多信息.
1> DragonDTG..:我修改了@ Ben的小提琴,将你的代码包含在你的两个测试中.我修改了一些代码以使其正确运行.当您点击运行按钮时,所有测试都将通过.再次点击运行按钮时,第二次测试("交替传递和失败")将失败 - 这基本上模拟了您的原始问题.
问题是你的第一个测试("总是通过测试")通过用重写函数替换函数来改变全局状态
jQuery.fn.on
.因此,当测试按顺序运行时,第二个测试("交替传递和失败")使用不正确的重写jQuery.fn.on
函数并失败.每个单元测试应该将全局状态返回到其测试前状态,以便其他测试可以基于相同的假设运行.它在pass和fail之间交替的原因是在引擎盖下QUnit总是首先运行失败的测试(它通过cookie或本地存储以某种方式记住它,我不完全确定).当它首先运行失败的测试时,第二个测试在第一个测试之前运行; 因此,第二个测试获得jQuery的本机
on
功能并且有效.当您第三次运行它时,测试将以其"原始"顺序运行,第二个测试将使用被覆盖的on
功能并失败.这是工作小提琴.我
on
通过缓存原始var jQueryOn = jQuery.fn.on;
函数并在测试结束时通过以下方式重置测试,在测试后添加修复程序以"取消覆盖"该函数:jQuery.fn.on = jQueryOn;
.您可以使用QUnit的模块teardown()
方法更好地实现它.您可以查看https://github.com/jquery/qunit/issues/74了解更多信息.
推荐阅读
如何解决《在SWRevealViewController上的didselecttableview上出错》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何在vi编辑器中搜索带空格和特殊字符的字符串》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何获取当前位置和拨出电话摘机时间(确切的呼叫选择时间)?》经验,为你挑选了0个好方法。 ... [详细] 如何解决《Python字典未正确更新》经验,为你挑选了1个好方法。 ... [详细] 如何解决《通过RESTfulAPI部署Tensorflow模型的示例》经验,为你挑选了2个好方法。 ... [详细] 如何解决《如何在首次启动时显示离子中的应用指令》经验,为你挑选了1个好方法。 ... [详细] 如何解决《Angular2,VisualStudio2015更新1,类型脚本配置》经验,为你挑选了2个好方法。 ... [详细] 如何解决《如何在Google自定义搜索中指定图像类型》经验,为你挑选了0个好方法。 ... [详细] 如何解决《Postgres创建/恢复在亚马逊ec2上花费了大量时间》经验,为你挑选了0个好方法。 ... [详细] 如何解决《带有多个跨度的文本溢出省略号》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何在动态生成的表行jquery中添加和操作id》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何检测无法在android中连接wifi?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《添加按钮到以编程方式创建的UIView》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何从主目录访问产品风味类?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《Android数据绑定NoSuchMethodError》经验,为你挑选了1个好方法。 ... [详细] 如何解决《SpringBoot-字体很棒的OTS解析错误:无法转换》经验,为你挑选了2个好方法。 ... [详细] 如何解决《为什么YYYY-MM-DD!=YYYY/MM/DD》经验,为你挑选了2个好方法。 ... [详细] 如何解决《使用whatsapp分享链接》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何减少if语句的长列表?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《使用斯坦福NLP(StanfordNERTagger和StanfordPOSTagger)为西班牙语设置NLTK》经验,为你挑选了1个好方法。 ... [详细]吐了个 "CAO" !Tags | 热门标签RankList | 热门文章
- 1在OCaml中编译和运行
- 2应用程序将无法生成错误无法找到可选库
- 3为什么Joda和Calendar会打印不同的时间?
- 4从UWP和ASP.NET 5引用类库
- 5谷歌地图api v3按州计算里程数
- 6在UICollectionViewCell上创建视差焦点效果
- 7Phoenix应用程序如何仅针对在多台计算机上使用通道规模进行定制?使用HAProxy?如何向所有节点广播消息?
- 8一种在Java中创建新实例的有趣方法
- 9如何阻止Intellij自动更改尚未编辑的行上的缩进?
- 10在Lumen(Laravel)中是否可以使用西里尔符号?
- 11对于仅使用JSON的后端REST应用程序,CSRF是强制性的吗?
- 12AWS:通过boto3发布Lambda函数的SNS消息(Python2)
- 13为什么Getopt :: Long没有初始化任何值?
- 14有没有办法在两个兄弟姐妹之间应用CSS样式?
- 15使用Javascript将表导出到MS Excel,在MS Edge上无效
- 16未列出MSSQLLOCALDB数据库
- 17Web开发中间件自动重新加载
- 18我何时应该使用GCM设备组与主题?
- 19EF7如何处理嵌套实体的更新操作
- 20在材质设计精简版中创建一个带可编辑数字字段的滑块
DevBox开发工具箱 | 专业的在线开发工具网站 京公网安备 11010802040832号 | 京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有