在Ember.js 1.0.rc1上与Konacha进行集成测试时遇到问题。我的问题是所有测试都在渲染任何视图之前运行。有没有办法知道什么时候已经渲染而不需要手动超时?
spec helper:
//=require sinon
//=require jquery
//=require jquery_ujs
//=require twitter/bootstrap
//=require handlebars
//=require ember
//=require ember-data
//=require_self
//=require icarium
window.lookupController = (name) ->
Icarium.__container__.lookup('controller:' + name)
window.currentPath = ->
lookupController('application').get('currentPath')
Ember.testing = true
Ember.run ->
window.Icarium = Ember.Application.create()
测试:
//=require spec_helper
describe "user login", ->
before (done) ->
Ember.run ->
Icarium.set 'ready', ->
done()
Icarium.initialize()
afterEach ->
Ember.run ->
Icarium.reset()
it "routes to login", ->
Ember.run ->
currentPath().should.eq "login"
it "renders the login form", ->
$('input[type=password]').should.exist
答案 0 :(得分:4)
将Konacha的重置功能设置为noop可能会起到作用:
Konacha.reset = ->
默认情况下,它会在每次测试前清除body elmenet。你可以在Jo Liss的幻灯片中找到这个和其他有用的tipp:http://www.slideshare.net/jo_liss/testing-ember-apps
答案 1 :(得分:0)
我有一个使用Konacha的example app和最近的Ember版本。我发现在每次测试运行之前推迟应用程序的准备就绪是有帮助的,然后提前准备就绪并等待新的App就绪承诺解决。这是来自test_helper.js的代码:
//= require konacha_config
//= require sinon
//= require application
// Prevent the router from manipulating the browser's URL.
App.Router.reopen({location: 'none'});
//**** Global before / after ***
// Sinon fake server
var server;
// Stub out Konacha.reset()
Konacha.reset = Ember.K;
beforeEach(function(done) {
// Fake XHR
server = sinon.fakeServer.create();
// Prevent automatic scheduling of runloops. For tests, we
// want to have complete control of runloops.
Ember.testing = true;
Ember.run(function() {
// Advance App readiness, which was deferred when the app
// was created.
//
// This needs to be done here, after each iframe has been setup,
// instead of in a global `before`.
App.advanceReadiness();
// When App readiness promise resolves, setup is complete
App.then(function() {
done();
});
});
});
afterEach(function() {
// Reset App
Ember.run(function() {
App.reset();
});
// Restore XHR
server.restore();
});