Итак, я запускаю некоторые тесты в моем приложении node.js.mocha testing beforeEach внутри цикла - асинхронный выпуск
Тест проходит через все мои модели и проверяет открытые api каждой модели. it
звонки проверяют только публичные модели, в зависимости от свойства модели public
.
Перед выполнением звонков it
, я хочу передать некоторые тестовые данные моделям, используя beforeEach
на каждой итерации. К сожалению, из-за асинхронных вызовов (я предполагаю) значение итератора в beforeEach
остается неизменным. Я предполагаю, что цикл выполняется еще до beforeEach
. У меня есть два вызова it
на модель, в результате чего beforeEach
вызывается дважды для каждой модели.
UPDATE
Я предполагаю, что я должен буду показать мой весь Прецедент причиной этого является немного более сложным, чем то, что я спросил здесь. Решение Коди кажется возможным, но это все еще не помогает моему варианту использования. Это связано с тем, что у меня есть несколько условий в цикле, которые запускают тест только для определенных моделей, а не для всех. Кроме того, есть два вызова it
, то есть beforeEach
вызывается дважды для каждой итерации цикла. Вот код:
var models = {'Ate': {'property1': 'prop'}, 'Bat': {'property2': 'prop2'}, 'Cat': {'property3': 'prop3'}};
var modelConfigs = {'Ate': {'public': 'true'}, 'Bat': {'public': 'false'}, 'Cat': {'public': 'true'}};
describe('Given an array of model objects', function(){
for(var key in modelConfigs) {
var m = key;
var modelConfig = modelConfigs[m];
var model = models[m].definition;
var modelPlural = models[m].settings.plural;
if(modelConfig.public) { // Condition runs for only some models
beforeEach(function (done) {
var test = this;
var testKey = m;
console.log(testKey); //Output is always Cat.
done();
});
lt.describe.whenCalledRemotely('GET', '/api/' + modelPlural, function() {
it('should have status code 200', function() { //First it call
assert.equal(this.res.statusCode, 200);
});
it('should be sorted DESC by date', function() { //Second it call
var modelRes = this.res.body;
expect(modelRes).to.be.instanceOf(Array);
expect(modelRes).to.have.length.below(11);
console.log(modelRes.length);
if(modelRes.length > 0) {
for(var i=1; i< modelRes.length; i++) {
expect(modelRes[i-1]['date']).to.be.at.least(modelRes[i]['date']);
}
}
});
});
}
}
});
Должны ли мы считать, app.models выглядит как '[{«а»: 'a'}, {'b': 'b'}, {'c': 'c'}] 'или как' {'a': 'a', 'b': 'b', 'c': «с»} '? Потому что '{{'a': 'a'}, {'b': 'b'}, {'c': 'c'}}' не является допустимым объектом javascript. Кроме того, ваш оператор for имеет опечатку, должен читать 'for (var key в моделях) {' вместо этого. –
Я набрал это в спешке, поэтому сделал некоторые опечатки. Я думаю, что код просто репрезентативный. Теперь я сделал изменения :) – KaushikTD
Нет проблем, всегда лучше всего исправлять мелкие опечатки, когда они замечаются, так как это помогает людям ответить на вопрос. Я опубликовал «рабочее» решение ниже, но это, безусловно, не самое чистое решение в мире. Он в основном разбивает цикл for на функции before/beforeEach. –