2016-06-29 11 views
0

私はmochaのループテストのためにそれを使っていくつかの問題を抱えてきました。私はsupertest、shouldとit-each modulesを使用しています。モカ:それはそれぞれ依存変数付き

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

ユーザー

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() 
     }); 
}); 

問題があり、このテストに割り当てられている私のvaribale、はIT-に渡されるhasAccessですそれぞれ前にユーザーに値が割り当てられています。私は、テストをお互いに依存させることは悪い習慣であることは承知していますが、これを実際にテストする別の方法はありません。私は完全にこれをテストするためにIDが必要です。そう考えていますか? さらに多くのオブジェクトがhasAccessになるので、ループを実行するのが最適です。ちょうどこれのためにそれを短縮しました。

答えて

1

あなたは本当にお互いにテストが依存させるべきではありませんが、問題がit.eachでなく、どのようにあなたがあなたの最初のテストで取得したユーザIDを格納しているといないで、あなたがしなければならない場合は...

。あなたはこのようなあなたの配列を作成します。

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

これはhasAccess[0].send.creatorフィールドにusersから値をとります。その時点で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

関連する問題