我使用qUnit和mockjax尝试处理一个简单的异步表单提交,但出于某种原因,async POST似乎通过了mockjax。
test 'RuleModal closes the modal on a successful form submission event', ->
$.mockjax
dataType: 'json'
url: '/url'
type: 'post'
responseText:
status: 'success'
$dom = $('<div class="show-modal"><form action="/url" method="post"></form></div>')
$form = $dom.find('form')
modal = new RuleModal($dom)
$form.submit()
equal $($dom).hasClass('show-modal'), false, 'closes the modal after form submission'
和实施
_bindSubmit: ->
modal = this
@$modal.find('form').on 'submit', (event) ->
event.preventDefault()
$.ajax
dataType: 'json'
url: @action
type: @method
data: $(this).serialize()
success: (data, status, xhr) ->
modal.close()
error: (xhr, status, error) ->
alert 'Something went wrong: ' + error
我尝试使用硬编码实现来完全匹配测试,但仍然无法正常工作。我做错了什么?
答案 0 :(得分:1)
我的猜测是,因为你做表单提交然后立即断言你正在遇到竞争条件。当$form.submit()
行运行时,equal ...
调用将执行并仍在运行。即使你已经模拟了ajax调用,它仍然是异步的。不幸的是,浏览器本机事件(如submit
)在完成时没有任何回调,因此您可能只需要setTimeout()
断言:
$form.submit();
setTimeout(function() {
equal($($dom).hasClass('show-modal'), false, 'closes the modal after form submission');
}, 100); // I think the default in Mockjax is 50ms
那或者您可以尝试在事件处理程序中执行此操作,但我认为这也会产生竞争条件。