Как можно вернуть значение из асинхронной функции в блоке before в mocha, чтобы можно было бы использовать это значение в этом же describe в функции?

Всем привет!

Столкнулся с проблемой при написании тестов. Я хотел бы сократить количество повторяемого кода, засунув его в функцию, которая бы принимала значения.

Псевдокод теста:
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


})


Но этот тест не сработает, потому что значение _value еще не изменено, так как изменяется оно в асинхронной функции.
Но вот такой тест сработает:

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
        ...
    }
        ...
})


Если сделать обертку из callback над it - mocha их просто не читает, а если над describe - то портятся выводы всех тестов, так как их результаты показываются после выполнения других тестов и уже нельзя понять к какому блоку тестов относятся эти тесты.

Если делать для каждого блока так, то размер кода будет увеличиваться очень сильно повторяющимся кодом.

Если сделать массив из значений, а потом использоватьarray.forEach - также не вариант, так как repeatTests в этом же describe будут другие it

Вроде банальная задача, а как то не получается догадаться как сделать)
  • Вопрос задан
  • 259 просмотров
Пригласить эксперта
Ответы на вопрос 1
Можно как вариант, воспользоваться async.waterfall()
https://www.npmjs.com/package/async#waterfall
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы