再度リファクタリング
ActiveDecoratorで実装してた部分をModelに移す。<- 見た目に関係しないコードはできるだけモデルでやる方針
方針
- 内部でhelperを使ってないコードとそうでないコードをわける
Springでrspecの高速化
単体テストを手動で走らせるのに結構時間かかるので。
調べると、springというのが良さそう。
個人でつかうため、プロジェクトのGemfileは使わずにやる方法。
$ gem install spring $ spring rspec
gem バージョンが古いというエラーが出るので、gemのアップデート
$ gem install rubygems-update $ update_rubygems
次のようにするといいらしい
$ gem pristine --all
gem pristine
: gemの隠し場所にあるファイルからインストールしたgemを初期状態へ戻す
from: Rubyのパッケージマネジメントシステムgem(Rubygems)のコマンド一覧
$ spring rspec hoge_spec.rb Version: 0.9.2 Usage: spring COMMAND [ARGS] Commands for spring itself: ....
あれ・・・?
こういうのがある
$ gem install spring-commands-rspec
~/.spring.rb
に次のように書く
require "spring/commands/rspec"
$ spring rspec path/to/hoge_spec.rb
成功。結構速くなって嬉しい。
参考その1
spec_helper等、specファイル中でロードエラーが出る場合。
$ spring rspec path/to/hoge_spec.rb require': cannot load such file -- spec_helper (LoadError)
こんな時は、プロジェクトルートで一回spring rspec
を実行しておく
$ spring stop $ cd $PROJECT_ROOT $ spring rspec path/to/hoge_spec.rb
これで、プロジェクトルートをカレントディレクトリとしてspringでrailsが読み込まれるので、requireでパスを正しく読み込める。
参考その2
emacsのrspec-modeで、上記のようにしてspringを使うと、自動ではspringがONにならない。 これはtmpにpidファイルが作られないため。 強制的にspringを使うには、次のように設定する。
(require 'rspec-mode) (defun rspec-spring-p () (and rspec-use-spring-when-possible (stringp (executable-find "spring"))))
ちなみに、rspec-modeではC-c , v
で開いているファイルに関連するテストだけを走らせる事ができる。
guard、使ったほうががいいですか
guardと組み合わせて使ってる人が多いみたい。guardは以前rails-tutorialやってる時に使ったけど、裏で走り続けるのがCPUの無駄使いにしか思えなくて使わなくなってしまった。guardの結果がエラーでも無視してコーディングすることも多かった。guard使ったほうがいい理由は、書いているコードが意図しない影響をもたらしてしまうことにすぐに気付いて方向修正できることなんだろうけど、commitの前にテストが通るか確認するだけでも十分な気もする。
Gitのpre-commit-hookでテスト走らせる
そんなことを考えていて、Gitのpre-commit-hookでテスト走らせればいいんじゃないかと思いつきました。同じようなことを考えた先達がいたようです。
- markhazlett/RSpec-Pre-commit-Git-Hook
- Matjaz Muhic : git pre-commit hook - commit if all RSpec tests passed
コミットにあまりに時間がかかるのは考えものですが、一回やってみてもいいかも。
Capybaraを使ったテストがOpenSSL::SSL::SSLErrorでコケる
omniauthで登録する画面でエラーが出る(OSX 10.9, ruby2.0, rails3.2.12)。
save_and_open_page
でブラウザ開いてみると、OpenSSL::SSL::SSLError
。
ここの、Errors with Ruby 2.0 > Alternative の手順で解決。SSL証明書が古くなっていたのが原因のよう。
kowabanaのローカル環境作った時からコケてて、そういうものかと放置してたのですが、@komagataさんに聞いたところ普通は全部通るとの事だったので、やっぱりか!、と思って調べてみました。
新知識
Active Record scopes vs class methods | Plataformatec Blog scopeじゃなくてClassMethodではだめなの?という疑問に対して