Sch*_*eis 10 javascript jquery unit-testing qunit
我有两个测试相互引起副作用.我理解为什么我要替换在第二次测试中内部调用的jQuery内置函数.然而,我不明白为什么测试交替通过和失败.
这个问题很相似但是,我没有直接在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');
});
Run Code Online (Sandbox Code Playgroud)
测试将从传递开始,但是当我刷新时,它们将在传递和失败之间交替.
为什么会这样?即使向网址添加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;
}();
Run Code Online (Sandbox Code Playgroud)
我修改了@ 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了解更多信息.
| 归档时间: |
|
| 查看次数: |
2077 次 |
| 最近记录: |