• ブログ
  • 写真
  • キーワード
  • ブックマーク
  • ログイン

Title

« 2007年11月09日 | 2007年11月11日 »
  • Rspecでコントローラのspecファイルを書く 2007-11-10 00:00:00

     Rspecを超いまさらながらやっています。Rspecで一番よくわからないのがMoc
    k とstubで、いまでも両者の違いがよくわかっていないし、mockはあるオブジェクトのフリをする仮想的なオブジェクトで、stubはあるインターフェースを偽装するボックスなのかなあとも考えたりしていますが、はっきりと理解していません。
     今、趣味でとあるwebアプリを作っていて、そのログイン処理の部分の仕様をRspecで書いてみました。

      before(:each) do
        @user = mock("user")
      end
    

    まずはUserモデルのインスタンスのフリをするmockオブジェクトをbeforeで作っておきます。Rspecの例などを見てみると、そのmockオブジェクトやPersonクラスにとstubを定義したりしていますが、今回のログイン仕様ではUserモデルのインスタンスは作らないので用意していません。
     で、ログインが成功する部分の仕様を書きます。

      it "should log in" do
        User.should_receive(:authenticate).with("abe@mail.com", "abe_pass").and_return(@user)
        post "login", {:email => "abe@mail.com", :password => "abe_pass"}
        response.should be_redirect
        response.should redirect_to(index_url)
        assigns[:current_user].should == @user
      end
    

     まずはUserモデルにstubを定義します。それぞれのitブロックの中で、それに関係するstubを宣言するのが、Rspecのやりかたみたいです。before部では全体に関係するようなstubだけを定義するらしい。しかも、そのときはshould_receiveメソッドではなくstub!メソッドを使って、検証はさせないようにするようです(こんな理解でいいのかな?)。
     これで、正当なメールアドレスとパスワードをPOSTメソッドで送ると、indexへリダイレクトされてログイン状態になるという仕様が定義されました。あとはこれを通るようにコードを書くだけです。
     ログインに失敗する部分の仕様は下記のとおり。

      it "shouldn't log in" do
        User.should_receive(:authenticate).with("itou@mail.com", "invalid_pass").and_return(nil)
        post "login", {:email => "itou@mail.com", :password => "invalid_pass"}
        response.should be_success
        response.should render_template("account/login")
        assigns[:current_user].should be_nil
      end
    
    Commentコメント(0) Pageリンク元(256) Append
  • ハドリアヌスの長城 (文春文庫)
    作者/アーティスト: Robert Draper,三川 基好
    メディア: 文庫
    集合知プログラミング
    作者/アーティスト: 當山 仁健,鴨澤 眞夫
    メディア: 大型本
  • Rspecではそれぞれの検証が分離している 2007-11-10 00:00:00

     言葉にすると至極あたりまえの話のような気もしますが、Rspecでは、モデルとコントローラとビューのテストはそれぞれ分離されています(Rspecでも、should have_tagでビューの検証ができてしまいますが、結合度が密になりやすそうなのであまり使わないほうがいいかもです)。結合度を疎にすることによって、コントローラの仕様を考えるときはそれに専念することができます。そして、どこかのエラーが他に影響を及ぼすのを防いでいます。例えば、ビューの仕様を変更してエラーが出たとき、そのビューの仕様をコントローラに書いているとコントローラでもエラーが出る(当たり前すぎることを書いていますね)のです。
     とはいえ、Test::Unitのfunctionテストとかだと、結構普通にコントローラとビューのテストを一緒に書いちゃってます。

      def test_diary
        get "diary", {:id => diaries(:abe_1).id}
        assert_response :success
        assert_template "diary/show"
        assert_select "#diary_#{diaries(:abe_1).id}" do
          assert_select "#title", diaries(:abe_1).title
          assert_select "#body", diaries(:abe_1).body
        end
      end
    

     ここでデザイナさんが、日記の内容のIDを"#message"に変えたりすると、このテストはエラーになってしまいます。しかし、コントローラがおかしくてエラーになるわけではないのです。
     さらにいうと、ここでDiaryモデルがid値からインスタンスを取得する部分の仕様を変えたときに、エラーになる可能性があります。
     ここで疎結合を保つために登場するのがmockとstubなのですね。なるほど。

    Commentコメント(0) Pageリンク元(31) Append
« 2007年11月09日 | 2007年11月11日 »

Twitterでのひとりごと

  • コードギアスはもうなんだかどうでもいい感じのお話になっている(09/07 22:37)
  • ターミナルを見た。いまいちかな。(09/06 23:58)
  • アップルから帰ってきました(09/05 23:00)
  • パナップを食べた。会社のパナップのほとんどをぼくが食べている気がする。(09/05 12:54)
  • photohito 見てたらカメラがほしくなってきた。http://photohito.com/(09/04 22:49)
  • 交通警察24時をやっているらしい。見たいなあ(09/04 20:42)
  • 超不毛な作業をしたので、自分へのご褒美にパナップを食べている(09/04 20:14)

プロフィール

おおいしつかさ

Amazon商品の一覧

人気の記事ベスト10

  • 1.apache+mod_proxy_balancer+mongrelでRailsを動かす方法
  • 2.Perlでevalを使ってみる
  • 3.バージョン管理をsubversionからgitに移行してみた
  • 4.tokyobikeのドロップハンドル化
  • 5.URLなど、長い英字を折り返して表示する方法
  • 6.ubuntu8.04でデュアルディスプレイを使う
  • 7.restful_authenticationを使ってみた
  • 8.Rspecでコントローラのspecファイルを書く
  • 9.Amazonの商品を手軽に扱えるプラグイン、AmazonResourcesをつくりました
  • 10.RailsとPostfixで受信メールを処理する方法

コメント

  • 武石(人に喜ばれること)
  • おおいしつかさ(googleからの本当のメール)
  • 武石(googleからの本当のメール)
  • ユル(日本酒と魚があれば何もいらない)
  • おおいしつかさ(日本酒と魚があれば何もいらない)
  • 武石(しつこい)(日本酒と魚があれば何もいらない)
  • 武石(日本酒と魚があれば何もいらない)

過去の記事

2006年
12月
2007年
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2008年
1月 2月 3月 4月 5月 6月 7月 8月 9月

キーワード一覧

ActionScript AmazonResources git javascript kaeruspoon milook NSR Objective-C Rails Ruby Ruby on Rails subversion Thin tokyobike ubuntu VAIO VAIO typeZ Waves Xen ぐりぐり カンタロー スノボー ドトール ドライブ バイク プログラミング ユルさん 執筆 日本酒 模型 真中洋嗣 自転車

Youtube

ニコニコ動画