Mocha: How return value from async function in before in mocha and use same value in same describe in function?

Created on 16 Jul 2015  Â·  2Comments  Â·  Source: mochajs/mocha

Faced with the problem when writing code. I want to reduce the amount of code used in the tests, but there are problems.

I have test, but he don't worked:

var repeatTests = function(value){
    it ('test1 use value', function(done){
        console.log (value) // return undefined
    }

    it ('test2 use value', function(done){
       console.log (value) // return undefined
    }
}

describe ('test', function(){
    var _value
    before(function(done){
        asyncFunction(function(err, value){
            _value = value
            done();
        }
    })
    repeatTests(_value) // value is undefined
})

But this worked:

describe ('test', function(){
    var _value
    before(function(done){
        asyncFunction(function(err, value){
            _value = value
            done();
        }
    })

    it ('test1 use value', function(done){
        console.log(_value); // return _value
    }

    it ('test2 use value', function(done){
        console.log(_value); // return _value
    }
})

I know why this is happening. Please tell me, how do I implement the first version of the test.

Most helpful comment

How about something like this?

var _value;

var asyncFunction = function(fn) {
  setTimeout(function() {
    fn(null, 'Your value!');
  }, 0);
};

var repeatTests = function() {
  it('test1 use value', function(done){
    console.log(_value)
    done();
  });

  it('test2 use value', function(done) {
    console.log(_value);
    done();
  });
}

describe('test', function() {
  before(function(done) {
    asyncFunction(function(err, value) {
      _value = value;
      done();
    });
  });

  repeatTests();
});
$ mocha example.js


  test
Your value!
    ✓ test1 use value
Your value!
    ✓ test2 use value


  2 passing (12ms)

All 2 comments

How about something like this?

var _value;

var asyncFunction = function(fn) {
  setTimeout(function() {
    fn(null, 'Your value!');
  }, 0);
};

var repeatTests = function() {
  it('test1 use value', function(done){
    console.log(_value)
    done();
  });

  it('test2 use value', function(done) {
    console.log(_value);
    done();
  });
}

describe('test', function() {
  before(function(done) {
    asyncFunction(function(err, value) {
      _value = value;
      done();
    });
  });

  repeatTests();
});
$ mocha example.js


  test
Your value!
    ✓ test1 use value
Your value!
    ✓ test2 use value


  2 passing (12ms)

Thanks! It's working!

Was this page helpful?
0 / 5 - 0 ratings