supertestとは
supertestはmochaと組み合わせて使うのですが、ExpressのRouterモジュールのテストを行うことができます。
例えば以下の例では、/
にアクセスしたらindexRouterが処理されるかテストしてくれます。
もちろん、/login
も/logout
もテストしてくれます。
app.js
app.use('/', indexRouter);
app.use('/login', loginRouter);
app.use('/logout', logoutRouter);
passport-stubとは
passport-stubは、passportモジュールを利用した認証システムを、テストする際に役に立ちます。
例えば、
「facebook認証などのテストをしたいけど、facebookアカウントを持っていない!」
といった時に役に立ちます。
テストの例
test.js
//supertestの読み込み
const request = require('supertest');
//supertestで使う、app.jsの読み込み
const app = require('app');
//passport-stubの読み込み
const passportStub = require('passport-stub');
//ログイン(/login)のテストであることを明示
describe('/login', () => {
//before、afterはmochaの機能
before(() => {
//テストの前にpassportstubモジュールでログイン
passportStub.install(app);
//'testuser'としてログイン
passportStub.login({ username: 'testuser' });
});
after(() => {
//テストの後にpassportstubモジュールでログアウト
passportStub.logout();
passportStub.uninstall(app);
});
//以下の記法は、supertestの記法
//テストの内容を指定
it('ログインのためのリンクが含まれる', (done) => {
//request(app).get('/login') で、 /login への GETリクエストを作成
request(app)
.get('/login')
//文字列を2つ引数として渡すとヘッダのテスト
.expect('Content-Type', 'text/html; charset=utf-8')
//正規表現を1つ渡すとHTMLのテスト
.expect(/<a href="\/auth\/facebook"/)
//期待されるステータスコードの整数と、テスト自体の引数に渡されるdone 関数を渡すと、レスポンスヘッダのテスト
.expect(200, done);
});
it('ログイン時はユーザー名が表示される', (done) => {
request(app)
.get('/login')
.expect(/testuser/)
.expect(200, done);
});
});
//ログアウト(/logout)のテストであることを明示
describe('/logout', () => {
//テスト内容を明示
it('ログアウト後に / にリダイレクトされる', (done) => {
////request(app).get('/logout')で、/logoutへのGETリクエストを作成
request(app)
.get('/logout')
// `/`へリダイレクトされるかのテスト
.expect('Location', '/')
// ステータスコードがリクエストであるかのテスト
.expect(302, done);
});
});
describe
、it
、before
、after
はmochaの書き方。
request(app).get
、.expect
はsupertestの書き方
passportStub.install(app)
、passportStub.login
はpassport-stubの書き方