2016-08-26 17 views
3

Node.js APIのジャスミンテストを書いています。私は、ユーザー機能の作成をテストしようとしています。テストは次のようになります。初期関数呼び出しの後にジャスミンテストを実行します。

describe('User test', function() { 
    describe('Post /api/saveUser'), function() { 
    it('saves a new user', function(done) { 
     request.post({url: 'http://website/api/saveUser', form:{email:testU.email, password:testU.password}, headers: {'authorization': adminU.jwt}}, function(err, res, body) { 
     expect(res.statusCode).toBe(200); 
     }); 
    }); 
    }); 
}); 

は、だから私は、リクエストに渡すために有効なトークンを取得する仕様でadminユーザー(adminU)を認証する必要があります。これは、別のエンドポイントを使用して行われます。

request.post({url: 'http://website/api/authenticate', form:{email:adminU.email, password: adminU.password}}, function(err, res, body) { 
    adminUser.jwt = JSON.parse(res.body).token; 
}); 

しかし、これらをどのように組み合わせますか。ユーザーテストブロックの上に認証コードを挿入すると、認証エンドポイントからの応答が受信される前にユーザーテストが実行されます。明らかな選択は、認証されたAPIからのコールバックでユーザーテストをラップすることですが、テストを実行するときにJasmineは実際にそれらを実行しません。

ジャスミン仕様でコールバックの結果を使用する最良の方法は何ですか?

+0

これは役に立ちます:http://stackoverflow.com/questions/27344872/testing-asynchronous-callbacks-with-jasmine –

+0

ありがとう、それは役立ちます。 'done()'を使って認証を "it"関数に置くことは、まず認証が成功したことを意味します。しかし、他のすべてのテストですべての仕様の認証呼び出しを保存するためのデータへのアクセス権があるので、 "it"仕様から正しく移動することは可能ですか?それとも悪い練習ですか/できないのですか? –

+0

私は本当にわかりません、私は最近ジャスミンを使い始めました。私がしたのはすばやいgoogleでした。興味深いリンクがいくつかあります: /www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=IkUosnCZw2Oは基本的にジャスミン非同期テストを検索しました –

答えて

0

authコールの要求が完了するまで待つ必要があります。

it('saves a new user', function(done) { 
    request.post({ 
     url: 'http://website/api/authenticate', 
     form: { 
      email: adminU.email, 
      password: adminU.password 
     } 
    }, function(err, res, body) { 
     adminUser.jwt = JSON.parse(res.body).token; 
     request.post({ 
      url: 'http://website/api/saveUser', 
      form: { 
       email: testU.email, 
       password: testU.password 
      }, 
      headers: { 
       'authorization': adminU.jwt 
      } 
     }, function(err, res, body) { 
      expect(res.statusCode).toBe(200); 
      done(); 
     }); 
    }); 
}); 

複数のテストでトークンが必要な場合は、前のブロックに入れることをおすすめします。これを行うと、jasmineはテストを開始する前にこれを一度実行し、すべてのテストケースでauthコールを行う必要はありません。

before(function(done){ 
    request.post({ 
     url: 'http://website/api/authenticate', 
     form: { 
      email: adminU.email, 
      password: adminU.password 
     } 
    }, function(err, res, body) { 
     if(err) done(err); 
     adminUser.jwt = JSON.parse(res.body).token; 
     done(); 
    }); 
}); 

また、apisのテストにはsupertestをおすすめします。 https://www.npmjs.com/package/supertest

+0

ありがとうございます。私は残念ながら以前の機能を持たないJasmine-nodeを使用していますが、これは最新の標準Jasmineリリースに切り替える魅力的な理由です。 –

関連する問題