2016-08-17 6 views
1

私はテスト駆動開発の初心者です。ログインAPIをテストしたいのですが、データベースでテストを実装する方法を完全に理解できていません。 ?MochaとChaiを使用してログインAPI NodeJをテストする方法

+0

あなたはどのフレームワークを使用していますか? – winter

+0

ORMとしてsequelize(CLI)を使用してexpressを使用しています。 –

+0

ご迷惑をおかけして申し訳ありません。つまり、どのようなWebフレームワークを使用していますか? – winter

答えて

3

まず、私もこのトピックの専門家ではありませんが、私はかなりの時間このメソッドを使用しています。誰かが私が書いていることが間違っている、あるいはやや誤解を招くことがわかったら、私を修正してください。私は非常に批評家や意見に開放されています。

TDD方式では、名前のとおり、実装前にテストを書く必要があります。基本的に、テストを書いて、失敗しているのを見て、実装を書いて、テストが合格するまで繰り返します。

expressを使用している場合は、supertestモジュールを使用することができます。彼らはそれを使用する方法はsuperagentに似ています。

npm install supertest --save-dev 

ここでは、mochaとchaiで使用する方法の非常に簡単な例を紹介します。だからここ

は特急アプリの例です:

// file: app.js 
const express = require('express'); 
const app = express(); 

// your middlewares setup goes here 

const server = app.listen(8000,() => { 
    console.log('Server is listening on port 8000'); 
}); 

module.exports = app; 

そしてここでは、ログインAPIの例のテストケースです:

// file: test/api.js 
const request = require('supertest'); 
const app = require('../app'); 
const expect = require('chai').expect; 

describe('Login API', function() { 
    it('Should success if credential is valid', function(done) { 
     request(app) 
      .post('/api/v1/login') 
      .set('Accept', 'application/json') 
      .set('Content-Type', 'application/json') 
      .send({ username: 'username', password: 'password' }) 
      .expect(200) 
      .expect('Content-Type', /json/) 
      .expect(function(response) { 
       expect(response.body).not.to.be.empty; 
       expect(response.body).to.be.an('object'); 
      }) 
      .end(done); 
    }); 
}); 

このコマンド

node_modules/mocha/bin/mocha test/**/*.js 
でそれを実行することができます

上記の例では、/ api/v1/loginパスにPOSTメソッドを使用してログインAPIを実装することを前提としています。また、json形式でデータを受信して​​応答することを前提としています。

{ 
    username: 'username', 
    password: 'password' 
} 

その後、それはあなたのAPIは200レスポンスコードで応答することを期待:例のテストケースは、それが/ API/V1 /次のデータにログインするPOSTリクエストを送信しようとしていることは何

.expect(200) 

コードが200以外の応答を受け取った場合、テストは失敗します。

あなたの応答のContent-Typeapplication/jsonであると予想します。期待が現実を満たしていなければ、テストも失敗します。

以下のこのコード:

.expect(function(response) { 
    expect(response.body).not.to.be.empty; 
    expect(response.body).to.be.an('object'); 
}) 

それはあなたのサーバーからの応答をチェックします。上記のようにチャイのexpectを関数本体の中に使用することができます。 supertestにはexpectメソッドもあります。しかし、supertestの期待値とchaiの期待値の両方を使用する方法は異なります。

最後に、doneコールバックでend関数を呼び出して、テストケースを正しく実行できるようにします。

supertestの使用方法の詳細については、supertestのマニュアルを参照してください。あなたはすべてのテストケースを実行する前に、データベース接続を維持する必要がある場合は

をテストする前に、データベース接続を確立

は、ここにアイデアだ:

testディレクトリ内に別のファイルを作成します。たとえば、database_helper.jsです。次に、次のコードを書いてください:

before(function(done) { 
    // write database connection code here 
    // call done when the connection is established 
}); 

これまで私はmongooseで試してみました。

私は役立つことを願っています。

+1

いくつかの考えを追加する:私はususally各テストの前に特定のデータでデータベースを初期化する。あなたは '' beforeEach(function(done){}); '' 'を使うことができます。 –

+0

エラーが発生しましたhttps://scontent-sit4-1.xx.fbcdn.net/v/t34.0-12/17821101_1469610449726804_1117021897_n.png?oh=0faa94eb2e5a915d27ab03017eda40e2&oe=58EADD80 –

+0

@RizwanPatelリンクを開くことはできませんが、私は答えを編集しました。私はエラーに感謝しなかった、ありがとう! – winter

関連する問題