2012 12月27日 18:05
zeus test で spec を走らせるとなぜかスペックが2度実行されるようになっていた。 spec/spec_helper.rb 内の require 'rspec/autorun' を削除すると治るようです。 spork で実行してみたり、 rake spec したりもしてみたけど、消したから起きている問題は今のところないです。 追記 zeus rake spec したときに DB がリセットされてなくて上手く動いてないことがわかった。全件まわしたい場合は rake spec を使用してたので気がつかなかった。 参考 https://github.com/burke/zeus/issues/180
2012 11月16日 11:07
Capybaraを2.0にしたら動かなくなった Cucumber の step がありました。titleタグ のtextをとる部分。visible でない要素のtextは取得できなくなったんでしょうか。 コードを追う余裕がなかったので、Nokogiriで対処した。 target = find("title").text expect(target).to eq(title) を target = Nokogiri::HTML.parse(page.source).css("title").text expect(target).to eq(title) に書き換えました。 ちょっと無理矢理。 Cucumberについてやりとりする仲間がいないので、titleタグのテキストの中身なんて確認しなくていいよ!とか、そういうい話ができないのが寂しいですね。
2012 8月21日 19:51
私はRSpecでテストをこんな感じで書いてるという良エントリがあったので少し便乗してみます。 まずは上記の記事を。 最終的なrspecについてですが、私の場合は以下のような感じにしてます。 といっても、前回もかいたように試行錯誤の毎日です。 # -*- coding: utf-8 -*- require_relative 'user' describe User do describe "#admin?" do subject { user.admin? } let(:user) { User.new(role: role) } context "管理者の場合" do let(:role) { 'admin' } it { should be_true } end context "一般ユーザの場合" do let(:role) { nil } it { should_not be_true } end end describe "#runnable_system?" do subject { user.runnable_system? } let(:user) { User.new(name: name) } context "管理者がリンディさんの場合" do let(:name) { 'Lindi' } before do user.stub!(admin?: true) end it { should be_true } end end end diffもつけておきます。 @@ -3,30 +3,34 @@ describe User do describe "#admin?" do + subject { user.admin?
2012 8月9日 23:42
Rspec書いてますか?最近なかなか荒れ気味ですが、僕はなんだかんだで嫌いじゃないです。 コントローラのテストは何をすべきかなかなか難しいです。 こんな感じでどうかなーというのを一応紹介しておきます。 何をテストするか 基本的には rspec を走られせるとこのコントローラが何をするのかわかるようにすることです。 どのアクションがどのHTTPメソッドを受けるのか どんな変数をビューに渡すのか リダイレクトするのか、しないのか どんなflashが設定されるのか 前提とする状況はなにか といったあたりがわかるようにしています。 どのアクションがどのHTTPメソッドを受けるのか これは単純にdescribeにかくだけですが、コード上ではlet式を利用して request という変数にバインドしてちょっとだけ目立つようにしています。 どんな変数をビューに渡すのか ビューに渡す値はインスタンス変数に入れますが、どの変数にどんな型の値が入るのかテストしています。 ビューを先にかくことが多いのでその際にpendingにして追加していくとコントローラかくときにビューの確認をする必要がありません。 あと、before_filterのようなものを利用しているの、その中で勝手にバインドするものがあるのでこれを明確にしてやったりします。 リダイレクトするのか、しないのか 対応するビューがあるのかないのか、うまくいくのどこの画面にいくのかが明確になるのでかいておきます。 どんなflashが設定されるのか これは変数の場合とだいたい一緒です。ビューではなく cucumber でのテストとの橋渡しな感じもあります。私はcucumberでは成功したらこの値が出てるのか確認してます。 前提とする状況はなにか ログインしている場合なのか、とかです。contextのブロックが増えるだけです。 それらを踏まえて上での雛形 コメントは解説のために。 describe HogeController do subject { request } describe "GET 'index'" do let(:request) { get :index, params } let(:params) { { hoge: "mogumogu"} } context "ログインしている時" do include_context "ログイン" # リダイレクトなどしない場合 it { should be_success } context "リクエストした時" do #
2012 6月22日 18:04
Ruby on Railsで ViewやHelperの Specを書く際に利用するマッチャーに良いのがないか探してます。現在のRspecはcontainぐらいしかないので、細かくチェックしたい場合は若干使いづらいです。というわけで、rspec-html-matchersを試しています。 以前は rspec-tag_matchers を使用していたのですが、出力がちょっとイマイチでした。 Ruby Toolsでざらざらと探した結果、rspec-html-matchersを試してみることにしました。 Form用のマッチャーがいろいろあったり、内部に存在するタグをチェックしたりできるのが嬉しいですね。capybaraのhave_cssはsubject側で find(selector)しておく必要があるので、ややめんどくさいです。 いまのところの不満点は Hashで渡していくのがちょっと格好悪い 正規表現での属性チェックができなかった 暗黙的なsubjectを使用する場合、ブロックがあると不具合がでる 3番目なんですが、have_tag マッチャーにブロックを渡し場合 shouldメソッドのレシーバをかかないと、ブロック内へと処理が流れないようです。 subject { render } it do should have_tag("a") do # このブロック処理が走らない with_tag("b") end end のように書いてしまうと with_tag("b") の部分が動作しません。3行目を明示的に subject.shouldとすると動いてくれました。rspecの問題なのか、rspec-html-matchersの問題なのか切りわけが難しいのでとりあえず、我慢することにしました。 ブロックを渡さない場合は大丈夫です。 他は良好に使えています。 View Specの良い例が欲しいです。