javascript – 使用Velocity和Jasmine测试Meteor时需要超时
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 使用Velocity和Jasmine测试Meteor时需要超时,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2922字,纯文字阅读大概需要5分钟。
内容图文
对流星,速度和茉莉很新,所以不确定我是否做错了什么,使用Jasmine作为它不适合的东西,或者这只是它的工作方式.
我发现我需要为我的所有测试设置超时,以便让它们通过.应该是这种情况还是我做错了什么?
例如,我正在运行的一些测试来检查验证消息:
describe("add quote validation", function() {
beforeEach(function (done) {
Router.go('addQuote');
Tracker.afterFlush(function(){
done();
});
});
beforeEach(waitForRouter);
it("should show validation when Quote is missing", function(done) {
$('#quote').val('');
$('#author').val('Some author');
Meteor.setTimeout(function(){
$('#addQuoteBtn').click();
}, 500);
Meteor.setTimeout(function(){
expect($('.parsley-custom-error-message').text()).toEqual("Quote can't be empty.");
done();
}, 500);
});
}
解决方法:
好吧,我们遇到了同样的问题并设计了一个非常优雅的解决方案,它不需要超时,是运行测试的最快方法.基本上,我们使用两种策略中的一种,具体取决于您正在等待的屏幕元素.
所有代码都进入tests / mocha / client / lib.coffee,而不是100%的Jasmine等价物,但它应该可用于所有客户端测试代码.我把它留在了Coffeescript中,但你可以在coffeescript.org上将它编译成Javascript,它也可以正常工作.
如果您所做的任何事情(路由或其他更改反应变量)导致模板(重新)渲染,您可以使用模板.< your_template> .rendered钩子来检测它何时完成渲染.所以,我们在lib.coffee中添加了以下函数:
@afterRendered = (template,f)->
cb = template.rendered
template.rendered = ->
cb?()
template.rendered = cb
f?()
return
return
它有什么作用?它基本上“记住”原始渲染回调,并暂时将其替换为在渲染模板并调用原始回调后调用额外函数的回调.它需要做这种内务处理,以避免破坏任何可能依赖于渲染回调的代码,因为你基本上是在直接搞乱Meteor代码.
在测试中,您可以执行以下操作:
it.only "should check stuff after routing", (done)->
try
Router.go "<somewhere>"
afterRendered Template.<expected_template>, ->
<your tests here>
done()
catch e
done(e)
我也推荐使用try-catch,因为我注意到异步错误并不总能进入速度系统,只是给你一个超时失败.
好的,然后有些东西实际上没有重新渲染,而是用JS或某种“显示/隐藏”机制生成的.为此,您确实需要某种超时,但可以通过使用轮询机制来减少超时的“时间成本”.
# evaluates if a JQuery element is visible or not
$.fn.visible = -> this.length > 0 and this.css('display') isnt 'none'
# This superduper JQuery helper function will trigger a function when an element becomes visible (display != none). If the element is already visible, it triggers immediately.
$.fn.onVisible = (fn,it)->
sel = this.selector
if this.visible()
console.log "Found immediately"
fn?(this)
else
counter = 0
timer = setInterval ->
counter++
el = $(sel)
if el.visible()
fn?(el)
clearInterval timer
console.log "Found on iteration #{counter}"
else
it?(el)
, 50
如果您愿意,可以删除控制台日志记录和辅助迭代器功能,它们并不重要.这允许您在测试中执行以下操作:
$('#modalId').onVisible (el)->
<tests here>
done()
, (el)->
console.log "Waiting for #{el.selector}"
如果需要,可以删除第二个函数,它是上面提到的迭代器函数.但请注意,此特定代码使用“display:hidden”作为隐身标记(Bootstrap执行此操作).如果您的代码使用其他机制隐藏/显示部件,请更改它.
对我们来说就像一个魅力!
内容总结
以上是互联网集市为您收集整理的javascript – 使用Velocity和Jasmine测试Meteor时需要超时全部内容,希望文章能够帮你解决javascript – 使用Velocity和Jasmine测试Meteor时需要超时所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。