让我们直截了当。
以下是我正在使用的一段代码,应该测试网络应用程序(目前仅显示<p>Welcome!</p>
)
var app = require('../app');
var assert = require('assert');
var Browser = require('zombie');
describe('home page', function() {
var browser, server;
before(function() {
server = app.listen(3000);
browser = new Browser({site: 'http://localhost:3000', debug: true});
});
it('should show welcome', function(done) {
// Wait until page is loaded
function pageLoaded(window) {
console.log('4');
return window.document.querySelector(".container");
}
console.log('1');
browser.visit("/");
console.log('2');
browser.wait(pageLoaded, function() {
console.log('3');
assert.ok(browser.success);
assert.equal(browser.text('p'), 'Welcomexxx!');
console.log(browser.html());
});
done();
});
after(function(done) {
server.close(done);
});
});
这个测试不应该通过,因为我正在检查Welcomexxx!不欢迎!。然而,无论我测试什么,它总是通过。 正如您所看到的,我在代码中添加了一些控制台输出,以查看发生了什么。令我惊讶的是,控制台中既没有3也没有4。这基本上意味着wait函数不会执行。
以下是未通过测试的预期输出:
home page
✓ should show welcome
GET / 200 5ms - 15b
1 passing (63ms)
这是我上述测试的输出:
home page
1
Zombie: Opened window http://localhost:3000/ //zombie debug line
2
✓ should show welcome
1 passing (22ms)
正如您所看到的,输出中也没有“get”语句。此外,zombie似乎也可以正常工作,因为browser.visit显示控制台输出,表明发生了某些事情。
有人能说清楚为什么会这样吗?我能够使用foreman start或node app运行应用程序,我可以在浏览器中看到一切正常(理论上)。
答案 0 :(得分:3)
对我来说,对done()的调用应该在browser.wait()的回调处理程序中
it('should show welcome', function(done){
....
browser.wait(pageLoaded, function(){
...
assert( ... );
done();
});
});
答案 1 :(得分:1)
你必须使用回调功能处理僵尸,或者像下面的例子一样处理承诺:
browser.visit("/").then(function(){
assert.ok(browser.success);
assert.equal(browser.text('p'), 'Welcomexxx!');
console.log(browser.html());
}).then(done, done);