Zombie / Mocha browser.wait(...)方法不会执行。

时间:2014-03-13 10:19:17

标签: javascript node.js mocha zombie.js

让我们直截了当。

以下是我正在使用的一段代码,应该测试网络应用程序(目前仅显示<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运行应用程序,我可以在浏览器中看到一切正常(理论上)。

2 个答案:

答案 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);