2016-06-29 74 views
0

所以我一直有一些麻煩,它 - 每個模塊的摩卡迴路測試。我使用supertest,應該和它 - 每個模塊。摩卡:使用它 - 每個因變量

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被傳遞到它 - 每個用戶之前分配一個值。我知道讓測試依賴於對方是不好的做法,但是沒有其他方法可以測試它。我需要這個ID來完全測試這個。那麼有什麼想法? 也有更多的對象在hasAccess,所以一個循環是最好的方式來做到這一點。爲此縮短了它。

回答

1

你真的不應該使測試彼此依賴,但如果你必須...

的問題是不是與it.each但你如何保存你在第一次測試獲得用戶ID。你創建你的數組是這樣的:

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