rspec でふつうにテストを書く方法しりたい

先日の railsdevcon 以後、ちゃんとテスト書くようにしはじめたものの、何をお手本にしたらいいものかわからず、手探りでテスト書いてるので、ふつうのテストの書きかたを知りたい。

だんだんテストコードじゃないのが増えてくる

テストのヘルパー的メソッドが増えてきたら、/spec/support に別のモジュールでわけるようにしてるけど、こういう使いかたでいいのかなー?

module HogeModelTestHelper
  FIXTURES = [:hoges]
  def self.included(closure)
    closure.extend Helper
    closure.send :include, Helper
    closure.send(:fixtures, *FIXTURES) if closure.respond_to?(:fixtures)
  end

  module Helper
    # なんかいろいろ書く
  end
end

spec のほうで呼んでつかう。

describe Hoge do
  include HogeModelTestHelper
  context 'ほげふがなとき' do
    subject { create_hoge }
    it { should be_valid }
    # とかなんとか
  end
end

実際にテストしてるのじゃないコードは、わけちゃってる。

携帯からのアクセスとかをテストする方法がわからない

スタブをつかうべきなのかもしれないと思いつつも、jpmobile がいろいろいいかんじにいろいろやってるので、スタブだとちょっと大変かも、と思ってるところ。仕方ないので、インチキしてる。

class ActionController::TestRequest
  def set_env(key, value)
    @env[key] = value
  end
end

とか書いて /spec/support においておいて、コントローラのテストでインチキをする。携帯の UID をつかった機能のテストとかで使う。

@request.set_env('HTTP_X_DCMGUID', uid)

あと、UA を偽装した風のリクエストをなげたりするときは、以下のようなインチキをしたりしてる。

module MobileAccessTestHelper
  private
  [:get, :put, :post, :delete].each do |http_method|
    define_method("#{http_method}_by_mobile") do |*args|
      set_mobile_ua
      send http_method, *args
    end
  end

  def set_mobile_ua(ua = "DoCoMo/2.0 SH902i(c100;TB;W24H12)")
    @request.user_agent = ua
  end 
end


ナイステスト情報しりたい。