互いに副作用を引き起こしている 2 つのテストがあります。2 番目のテストで内部的に呼び出されている 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');
});
テストは合格から始まりますが、更新すると、合格と不合格が交互に繰り返されます。
なぜこうなった?URL に GET パラメーターを追加しても、ページ上で同じ動作が発生します。
失敗するケースでは、ハンドラーが設定されている.on()
ときに内部 jQuery が呼び出しているため、テストが失敗しています。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;
}();