【问题标题】:Use mocha programmatically via rest通过 rest 以编程方式使用 mocha
【发布时间】:2017-08-11 12:41:56
【问题描述】:

目前我试图弄清楚如何在 localhost:3000/run/tests 资源的 GET 请求上运行 mocha 测试。

大多数事情似乎工作正常,但 mocha .on('end') 可能没有正确触发,所以我的 res.json(...) 函数没有被调用并且节点仍然挂起。

var Mocha = require('mocha');
...    

app.get('/run/tests', (req, res) => {
    var mocha = new Mocha({
        reporter: 'json'
    });

    myTestFiles.forEach(testfile => mocha.addFile('./tests/' + testfile + '.js'));

    mocha.run()
    .on('end', function() {
        console.log(this.testResults);
        res.json(this.testResults);
    });
});

我得到了预期的输出,除了“0通过”行:

> ...
> CALL element.text()
> GET /session/:sessionID/element/9/text
> RESPONSE element.text() "Username"
  √ App login finished: 37685ms

  0 passing (0ms)
  0 passing (16ms)

我的测试文件如下所示:

'use strict';
require('./helpers/setup');

var wd = require('wd');
var serverConfigs = require('./helpers/appium-servers');

describe('Carnet App', function () {
    this.timeout(120000);
    var driver;
    var allPassed = true;

    before(function () {
        var serverConfig = serverConfigs.local;
        driver = wd.promiseChainRemote(serverConfig);
        require('./helpers/logging').configure(driver);
        var desired = {
           'appium-version': '1.4.16',
           platformVersion: '6.0.1',
           device: 'Android',
           platformName: 'Android',
           app: myapp.apk'
        };
        return driver
        .init(desired)
        .setImplicitWaitTimeout(120000);
    });

    after(function (done) {
    return driver
        .quit()
        .done();
    });

    afterEach(function () {
        allPassed = allPassed && this.currentTest.state === 'passed';
    });

    it('App login finished', function () {
        return driver
        .elementById('...')
        .click()
        .sendKeys('...')
        .elementById('...')
        .text().should.become('Username');
    });
});

我犯错了吗?有人以编程方式使用 wd + mocha 过期吗?感谢您的帮助!

【问题讨论】:

  • 看起来它是一个异步问题......所以你的工作在测试执行之前完成。在您的it() 函数中向底部...传递done 到您的回调中并在should.become 下方调用done()
  • 您的意思是it('App login finished', function (*done*) {.done();.text().should.become('Username') 之后?似乎这也从未完成 mocha 过程......但是如果我将 mocha.run().on('end' .... 更改为 mocha.run(function (failures) { res.json({}) } 这似乎工作并在 mocha 完成测试后调用 res.json。但我无法对单个“测试结束”事件做出反应。
  • github.com/mochajs/mocha/wiki/Using-mocha-programmatically 似乎您可能使用不同的事件处理程序,因为它们在传递给.run()的 cb 中被调用

标签: node.js selenium mocha.js appium


【解决方案1】:

好的,我只通过修改以下内容解决了我的问题:

mocha.run(function(failures){
    res.json({ ... })
})
.on('test', function() {
    // do some logging stuff (into a var retured by res.json above)
})

// ... all mocha events possible
// see https://github.com/mochajs/mocha/blob/master/lib/runner.js#L49

.on('test end', function() {
    // do some advanced logging stuff
});

【讨论】:

    猜你喜欢
    • 2013-03-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多