mocha测试beforeEach在循环内 - 异步问题

时间:2015-05-22 07:56:15

标签: javascript node.js asynchronous mocha loopbackjs

所以,我正在我的node.js应用程序上运行一些测试。

测试遍历我的所有模型并检查每个模型的暴露api。 it调用仅检查公共模型,具体取决于模型的public属性。

it调用之前,我希望在每次迭代时使用beforeEach将一些测试数据传递给模型。不幸的是,由于异步调用(我猜),beforeEach中的迭代器值保持不变。我猜测循环甚至在beforeEach之前执行。我对每个模型进行了两次it次调用,导致每个模型调用两次beforeEach

更新

我想我必须展示我的整个用例,因为这比我在这里问的要复杂一些。 Cody的解决方案似乎有可能,但它仍然无法帮助我的用例。这是因为我在循环中有一些条件只对某些模型运行测试而不是全部。此外,还有两个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']);
                        }
                    }
                });
            });    
        }
    }
});

1 个答案:

答案 0 :(得分: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)
    })
  }
})