Node.js:在请求回调中运行mocha测试

时间:2017-06-30 16:53:20

标签: node.js request mocha

我想运行一些测试,其设置需要先通过HTTP GET下载。

我的下载成功但我的测试在请求回调中没有运行。我知道它不是最好的结构,但我也想知道为什么这不起作用。

describe('test', () => {
    request.get({
        url: 'https://google.com',
    }, (err, status, body) => {
        // The content is downloaded successfully.
        console.log(body);

        // This test never runs, why?
        it('should be able to run inside a request.get', () => {
        });
    });
});

我知道这段代码有效,但我仍然想知道为什么上一个例子没有。

describe('test', () => {
    it('should be able to run inside a request.get', () => {
        request.get({
            url: 'https://google.com',
        }, (err, status, body) => {
            console.log(body);
        });
    });
});
编辑:Jankapunkt的评论提供的建议有效:移动'它'并且'描述'一起允许成功下载和测试运行。

request.get({
    url: 'https://google.com',
}, (err, status, body) => {
    // The content is downloaded successfully.
    console.log(body);
    // The describe and it are within the same closure.
    describe('test', () => {
        // This test runs successfully.
        it('should be able to run inside a request.get', () => {
        });
    });
});

2 个答案:

答案 0 :(得分:0)

古老的主题,但我确实是想在模拟蒙哥连接中使用

const manager = require('./manager')
const assert = require('assert')
const MongoClient = require('./MockMongo')
let conn

describe('test execution', function() {
  it('db connection', function (done) {
    MongoClient.connect('test url')
      .then((db) => {
        conn = db
        done()
      })
  })

  it('test 1', function (done) {
    manager.methodOfManager(conn, 'param1', 'param2')
      .then(r => {
        assert.equal(r.result, 'ok')
        done()
      })
      .catch(err => {
        console.log(err.message)
        done(err)
      })
  })
})

它将打印:

  

测试执行

✓ db connection (5ms)
✓ Test 1 (sepa) (125ms)
     

2通过(0s)

答案 1 :(得分:-1)

方法1:在GET结果中进行测试

在回调函数中的describe()周围使用it(),并避免使用以下箭头函数:

it("...", () => {});

当你改变上下文时它is discouraged in mocha

改为使用

it("...", function(){});

并在async tests中需要时使用.binddone()或承诺。

将这些放在您的代码示例中,您可能会发现您的代码与以下内容类似:

request.get({
    url: 'https://google.com',
}, (err, status, body) => {
    // The content is downloaded successfully.

    describe('test', function() {
        it('should be able to run inside a request.get', function() {
            assert.isDefined(status);
            assert.isDefined(body);
            //...and so on
        });
    });
});

顺便说一句,如果你的方法是更好的结构,那只是一个糟糕的结构。

方法2 - 在您的单位中包裹request.get

这是(在我看来)更好,更像mocha的方法,你在测试中执行请求并使用done()回调通知mocha,你已经完成了:

describe('test', function() {

    let request;

    beforeEach(function(){
        // request = ...
    });

    it('should be able to get a request result', function(done) {
        request.get({
            url: 'https://google.com',
        }, (err, status, body) => {

           assert.isDefined(status);
           assert.isDefined(body);
           //...and so on

           // at the end call done
           done();
    });
});

您可以使用beforeEach挂钩确保将每个测试的请求初始化为新的新实例。