はじめに
このブログを読んでいる皆さんはおそらく息を吐くようにRSpecを書いている方々ばかりだと思うので恐縮なんですが、僕は初心者なんでまとめて置きます。あらかじめ伝えて置きますがRailsの話は一切ありません。このブログを読んでいる皆様方の得意言語が "Rails" であるのは重々承知なのですが、申し訳ない僕はRSpecだけやりたいのでそれをやるのです。
概要
そんなわけでまずはRSpecとはなんぞやという話を3行ぐらいでやっていきます。まあ、細かいことは公式サイトを見ましょう。
公式
rspec.info
RSpecとはこのようなものです。そう、Rubyで楽しくTDDするやつです。TDDについては以下のようなサイクルでやっていくことを指します。
・失敗するテストを書く(RED)
・できる限り早く、テストに通るような最小限のコードを書く(Green)
・コードの重複を除去する(Refactor)
へー、そうなんだ。ということでそういうツールなのがわかったので早速インストールします。さてRSpecなんですが4種類あります。GitHubの方にはもっとあるように見えるけど気にしてはいけない。
・rspec-core … 基本機能
・rspec-expectations … マッチ処理に使えるやつ
・rspec-mocks … モック使ったテストに使えるやつ
・rspec-rails … Railsで使えるテストフレームワーク集
ざっくりこんなやつ。今回Rails使わないのでrspec-railsの出番はなしです。一体どれを使えばいいんだとなりますがgem install rspec
で上三つ落とせます。ということで早速触っていきます。
動かしてみる
# 導入 $ gem install rspec # プロジェクトセットアップ $ rspec --init create spec/spec_helper.rb create .rspec
.rspecファイルが設定ファイルらしい。細かい書き方ここにあった。
Home · rspec/rspec Wiki · GitHub
--require spec_helper
ってのrequire
なしで動かしてくれるやつらしいですね。あとなんか知らんけど--color
つけて色つくようにしてみる。
そんじゃあハローワールドでも書いて動かしてみます(?)。
# RSpec使うグループの宣言 RSpec.describe 'is this Hello World?' do # やることの名前 it 'This is include in Hello World' do # 期待する動作 *失敗しないとログに表示されないので失敗させる expect("failure word").to include("Hello World") end end
$ rspec ./spec/***.rb F Failures: 1) is this Hello World? This is include in Hello World Failure/Error: expect("failure word").to include("Hello World") expected "failure word" to include "Hello World" # ./spec/rpectest.rb:8:in `block (2 levels) in <top (required)>' Finished in **** seconds (files took **** seconds to load) 1 example, 1 failure Failed examples: rspec ./spec/***.rb:6 # is this Hello World? This is include in Hello World
無事指定した用語に"Hello World"は含まれていないよというエラーが出ました。
黒い画面の方の問題なんだろうけど日本語対応できない……。なので英語で書きます。ツールの使い方よりも英語の書き方のせいで難しくなっているのではないかという疑惑でてきました。まあなんかしら調べれば日本語化対応できるものあんでしょ。調べるの面倒なので今回はこのままやっていきます。んで、指摘されてる行上のサンプルとずれてるけど許して無駄なコメントアウト入れてる分だから…。
といった感じにexpect
内に必要情報をねじ込んでやればテストできるっぽいです。こんな感じに。
myWord = "failure word" # RSpec使うグループの宣言 RSpec.describe 'is this Hello World?' do # やることの名前 it 'This is include in Hello World' do # 期待する動作 expect(myWord).to include("Hello World") end end
というわけでRSpecだけやりました。こんな感じに使えばいいっぽいですね。美しいテストの書き方とか知りません。僕はRSpec触りたいだけでこの記事書いてます。そもそも作るものがなければTDDできないのです。
おわり