2016-06-29 8 views
0

Так что у меня были некоторые проблемы с этим - каждый модуль для тестирования цикла в мокко. Я использую supertest, should и it-every modules.Mocha: используя его - каждый с зависимыми переменными

var hasAccess = [{endpoint: "announcements", send: {"creator": users}}] 

пользователи мой varibale, который назначается в этом тесте

it('users', function(done) { 
     api.get('/users') 
     .set('Accept', 'application/json') 
     .set('Authorization', devToken) 
     .expect(200) 
     .expect('Content-Type', /json/) 
     .end(function(err, res) { 
      if (err) return done(err) 
      res.body[0].should.have.property('id') 
      users = res.body[0].id    //<---------- 
      done() 
     }); 
    }); 

Моя он-каждый

it.each(hasAccess, 'should return 201 perfoming a POST on %s', ['endpoint'], function(element, next) { 

    console.log(element.send) //prints out "creator": undefined 

    api.post('/' + element.endpoint) 
     .set('Accept', 'application/json') 
     .set('Authorization', userToken) 
     .expect('Content-Type', /json/) 
     .send(element.send) 
     .expect(201) 
     .end(function(err, res) { 
      if (err) return next(err) 
      res.status.should.equal(201) 
      next() 
     }); 
}); 

Проблема заключается в том, HasAccess это не передается в IT- каждый до пользователям присваивается значение. Я знаю, что плохая практика заключается в том, чтобы сделать тесты зависимыми друг от друга, но нет другого способа проверить это. Мне нужен идентификатор, чтобы полностью проверить это. Итак, какие-нибудь идеи? Также будет больше объектов в hasAccess, поэтому цикл - лучший способ сделать это. Просто сократил это для этого.

ответ

1

Вы действительно не должны делать тесты зависят друг от друга, но если надо ...

Проблема не с it.each, но с тем, как вы храните идентификатор пользователя, который вы получите в первом тесте. Вы можете создать свой массив так:

var hasAccess = [{endpoint: "announcements", send: {"creator": users}}] 

Это принимает значение от users для hasAccess[0].send.creator поля. Это undefined в этой точке, поэтому поле получает значение undefined. С этого момента изменения, внесенные вами в users, не будут влиять на значения, хранящиеся в hasAccess. Если users были объектом, то hasAccess будет ссылаться на этот объект, и изменение объекта будет отражено в hasAccess, но это примитивное значение: undefined. Поэтому дальнейшие изменения в users здесь не влияют.

Для того чтобы изменения переносились вперед, ваш первый тест мог попасть в поле, пройдя массив hasAccess.

Вот иллюстрация того, как это можно сделать. Я смоделировал асинхронные процессы с setTimeout:

require("it-each")(); 
var assert = require("assert"); 

var users; 
var hasAccess = [{endpoint: "announcements", send: {"creator": users}}]; 

it("get users", function (done) { 
    setTimeout(function() { 
     // Wrong way: 
     // users = "foo"; 

     // Right way: 
     hasAccess[0].send.creator = "foo"; 
     done(); 
    }, 1000); 
}); 


it.each(hasAccess, 'should return 201 perfoming a POST on %s', ['endpoint'], 
     function(element, next) { 
      setTimeout(function() { 
       assert(element.send.creator === "foo"); 
       // console.log(element); 
       next(); 
      }, 1000); 
     }); 
+0

А, это имеет смысл. Просто он работает, спасибо за прояснение объектов. – Delonous