2015-05-22 4 views
0

Итак, я запускаю некоторые тесты в моем приложении 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']); 
         } 
        } 
       }); 
      });  
     } 
    } 
}); 
+0

Должны ли мы считать, app.models выглядит как '[{«а»: 'a'}, {'b': 'b'}, {'c': 'c'}] 'или как' {'a': 'a', 'b': 'b', 'c': «с»} '? Потому что '{{'a': 'a'}, {'b': 'b'}, {'c': 'c'}}' не является допустимым объектом javascript. Кроме того, ваш оператор for имеет опечатку, должен читать 'for (var key в моделях) {' вместо этого. –

+0

Я набрал это в спешке, поэтому сделал некоторые опечатки. Я думаю, что код просто репрезентативный. Теперь я сделал изменения :) – KaushikTD

+0

Нет проблем, всегда лучше всего исправлять мелкие опечатки, когда они замечаются, так как это помогает людям ответить на вопрос. Я опубликовал «рабочее» решение ниже, но это, безусловно, не самое чистое решение в мире. Он в основном разбивает цикл for на функции before/beforeEach. –

ответ

0

Следующий код работает, хотя я уверен, что есть чистое решение доступно:

var models = {'a': 'a', 'b':'b', 'c':'c'} 
var modelsArray = [] 
for(var key in models) { 
    modelsArray.push(key) 
} 
describe("Given models", function() { 
    var currModel, index, testKey, test 
    before(function() { 
    index = 0; 
    }) 
    beforeEach(function() { 
    test = this; 
    testKey = modelsArray[index] 
    currModel = models[testKey] 
    index++ 
    }) 
    for(var i = 0; i < modelsArray.length; i++) { 
    it("Does whatever you need to test", function() { 
     console.log(testKey) 
    }) 
    } 
}) 
+0

Эй, Коди, пожалуйста, взгляните на мое обновление, возможно, это даст вам лучшее представление о том, что на самом деле проблема. Ваше решение работает на вопрос, который я задал, но мой вариант использования немного сложнее. Изменили вопрос соответствующим образом. Благодаря! – KaushikTD

Смежные вопросы