RSpecえかきうた

初めまして、takanekoと申します。 入社して以来2年くらい「ブログ書きます!」と言いつつすっぽかし続けたダメWebエンジニアです。 RSpecえかきうた? 「ぼくのあーるすぺっくのかきじゅん」(僕のRSpecの書き順)です。 RSpecの書き方わからない、という方のために、0から書き上げる際の参考になればと思い書きました。 Specを書き始めましょう RSpecにはModel Spec、Feature Spec、Request Spec、System Specなど色々種類がありますが、今回はRequest Specを書いていきます。APIとかのテストをする際に使うSpecです。 書き順がメイントピックなので、細かい実装の妥当性とかは無視して、以下のような簡単な仕様のユーザ登録APIでSpecを書きたいと思います。 API仕様 URL POST /users(format: :json) email, password, password_confirmationをPOSTしてユーザ作成 作成したら200 OKとユーザのidをjsonで返却する 全てのパラメータが揃わない限り、400 Bad Requestを返却する メールアドレスが重複する場合も、400 Bad Requestを返却する 管理者アカウントでログインしていない場合、401 Unauthorizedを返却する spec/requests/users_create_spec.rbに空のSpecを書いてスタートしましょう。 require ‘rails_helper’ RSpec.describe ‘POST /users’, type: :request do # やるぞ end テストケースを羅列します contextとitだけ並べて、自然言語で仕様を書き起こしましょう。 RSpec.describe ‘POST /users’, type: :request do context ‘全てのパラメータが揃っている場合’ do it ‘200 OKを返す’ it ‘成功時のJSONレスポンスを返す’ it ‘ユーザを登録する’ end context ’emailパラメータが不足している場合’ do it ‘400 Bad Requestを返す’ it ‘パラメータ不正のJSONレスポンスを返す’ it ‘ユーザを登録しない’ end context ’emailが既に登録されている場合’ do it ‘400 Bad Requestを返す’ it ’email重複エラーのJSONレスポンスを返す’ it ‘ユーザを登録しない’ end context ‘管理者アカウント未ログインの場合’ do it ‘401 Unauthorizedを返す’ it ‘ユーザを登録しない’ end end どうでもいいけど、結合テスト仕様書ってこんな感じですよね。 expectを書きましょう テストを書く上で一番時間のかかる部分は前提条件です。(今回は簡単な仕様のテストなのでさほど感じませんが) その間テストが形にならず、何かやったという気になりません…。 でも、itに自然言語で記述した内容をexpectに起こすのは流れ作業でできそうです。expectから書いていきましょう。 expectはテストのゴールなので、それが明確になるとちょっとだけやる気が出てくるような気がします(弱気)。 RSpec.describe ‘POST /users’, type: :request do context ‘全てのパラメータが揃っている場合’ do it ‘200 OKを返す’ do post ‘/users’, params: { email: ‘test@bpsinc.jp’, password: ‘hogehoge’, password_confirmation: ‘hogehoge’ }, headers: { ‘ACCEPT’ => ‘application/json’ } expect(response).to have_http_status(:ok) end it ‘成功時のJSONレスポンスを返す’ do post ‘/users’, params: { email: ‘test@bpsinc.jp’, password: ‘hogehoge’, password_confirmation: ‘hogehoge’ }, headers: { ‘ACCEPT’ => ‘application/json’ } expect(JSON.parse(response.body)).to eq( ‘user’ => { ‘id’ => User.find_by(email: ‘test@bpsinc.jp’).id } ) end it ‘ユーザを登録する’ do expect do post ‘/users’, params: { email: ‘test@bpsinc.jp’, password: ‘hogehoge’, … Continue reading RSpecえかきうた