Rspec 単体テストの導入
Railsアプリでの単体テストとして、Rspecを導入しましたので、 導入方法および簡単なテストの記述について説明したいと思います。
gemを追加します。
まずは、
Gemfile group :development, :test do ~省略~ gem 'rspec-rails' end group :development do gem 'web-console' end
gemfileをインストールしたら、
bundle installをします。
その後に、Rspecの基本設定をします。
ターミナルから、以下のコマンドを入力してください。
ターミナル rails g rspec:install
すると、以下のファイルが作成されます。
create .rspec create spec create spec/spec_helper.rb create spec/rails_helper.rb
rails_helper.rbというのは、 Rspecを利用する際に、共通の設定を書いておくファイルのことです。
今回は、ユーザー新規登録のテストを書いてみます。
spec/models/user_spec.rbを作成します。
そして、基本となるコードを書いてみます。
require 'rails_helper' describe User do describe '#create' do it "is invalid without a name" do end end end
上記の記述について、説明します。
describe do
end
というのは、
期待する結果をまとめて記述(describe)しています。 このケースでは User モデルがどんなモデル なのか、 どんな振る舞いをするのかということを説明しています。
it ~ do
end
のところで、実際に動作するテストコードのまとまりを記述します。
上記の例では、
「名前の入力がないと登録ができない」ということを確認したいため、
it "is invalid without a name" do
end
と記述しています。
それでは実際に、テストを記述してみます。
user = User.new(name: "", email: "test@gmail.com", password: "123456", password_confirmation: "123456") user.valid? expect(user.errors[:nickname]).to include("can't be blank")
1行目の
user = User.new(name: "", email: "test@gmail.com", password: "123456", password_confirmation: "123456")
のところで、userクラスのインスタンスを作成しています。
2行目の
user.valid?
で作成されたインスタンスが、
userクラスのバリデーションに引っかかっているかどうかを確認しています。
valid?メソッドの返り値は、 true、falseですが、falseが返り値の場合、 errorsメソッドを使うことで、エラーの原因を確認することができます。
3行目の expect(user.errors[:name]).to include("can't be blank")
というのは、 インスタンスが持つエラー文が期待したものとなっているかどうかを確認しています。
expectというのは期待するという意味、
includeというのは含むという意味です。
そのため、3行目は
「userインスタンスのnameカラムに関するエラー文には、can't be blankという言葉が含まれる。」
ということを確認しています。
それでは、今日はこのあたりで、、、