外部に HTTP アクセスする機能の単体テストで WebMock 使ってみた

ブログの Feed をダウンロードする機能の単体テストで、いちいち本物の Feed にアクセスしたくない。テスト遅くなるし、Feed 更新されたらテスト結果変わっちゃうし。

こういうときはスタブやモックの出番。WebMock という gem を使うことにした。

WebMock はメジャーどころの http ライブラリに対応しているので、Net::Http 以外のときでも使えるのがウレシイ。

require "spec_helper"
require "webmock/rspec"

FEED_LINK = "http://tnakamura.hatenablog.com/feed"

describe Feed do
  before do
    # FEED_LINK にアクセスしたら FEED_BODY を返すスタブを作成
    stub_request(:get, FEED_LINK).to_return({
      :body => FEED_BODY,
      :status => 200,
    })
  end

  it "フィードをダウンロードして保存できる" do
    @feed = Feed.create_from_feedlink(FEED_LINK)

    @feed.title.should eq("present")
    @feed.link.should eq("http://tnakamura.hatenablog.com/")
  end
end

# テスト用のフィード
FEED_BODY = <<-EOF
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
  <title>present</title>
  <link href="http://tnakamura.hatenablog.com/"/>
  <updated>2012-12-17T20:30:04+09:00</updated>
  <author>
    <name>griefworker</name>
  </author>
  <generator uri="http://blog.hatena.ne.jp/" version="280c049171b3c27b6e6bc0ff0982be84">Hatena::Blog</generator>
  <id>http://blog.hatena.ne.jp/id/12704346814673850430</id>
    <entry>
        <title>Johan</title>
        <link href="http://tnakamura.hatenablog.com/entry/2012/12/17/203003"/>
        <id>http://tnakamura.hatenablog.com/id/12704830469096482706</id>
        <updated>2012-12-17T20:30:03+09:00</updated>
        <summary>福岡三越地下2階にある Johan でパンを買ってみた。三越に行くには天神地下街をかなり南下しないといけないから、昼休みに気安く行けないのが難点。 今回のお目当てはチョコブレッド。Johan の横を通るたびに目に入るから気になっていたんだけど、売上4位の人気商品だったのか。生地の</summary>
        <content type="html">&lt;p&gt;福岡三越地下2階にある Johan でパンを買ってみた。</content>
        <category term="食べ歩き" label="食べ歩き" />
        <author>
            <name>griefworker</name>
        </author>
    </entry>
    <entry>
        <title>Evergreen を導入したばかりだけど Konacha に移行した</title>
        <link href="http://tnakamura.hatenablog.com/entry/2012/12/13/060729"/>
        <id>http://tnakamura.hatenablog.com/id/12704830469096352314</id>
        <updated>2012-12-13T06:07:29+09:00</updated>
        <summary> 先日 Evergreen を導入したけど Evergreen は今メンテされてないってコメントで教えてもらった。確かに、README よく見たら書いてあるし…。完全に見落としてた。不覚。README のリンク先、Google グループのスレッドでは Konacha っていう R</summary>
        <content type="html">
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;先日 Evergreen を導入したけど&lt;/h4&gt;
        </content>
        <category term="Ruby" label="Ruby" />
        <author>
            <name>griefworker</name>
        </author>
    </entry>
    <entry>
        <title>Evergreen で Rails アプリの JavaScript を単体テストする</title>
        <link href="http://tnakamura.hatenablog.com/entry/2012/12/11/213800"/>
        <id>http://tnakamura.hatenablog.com/id/12704830469096340501</id>
        <updated>2012-12-11T21:38:00+09:00</updated>
        <summary> はじめに Rails アプリの JavaScript のテストは capybara(+capybara-webkit) を使えば一応できるけど、統合テストなのがね…。統合テストもちゃんと書くけど、やりたいのは JavaScript の単体テストなのに。 そこで Evergree</summary>
        <content type="html">
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;はじめに&lt;/h4&gt;
        </content>
        <category term="Ruby" label="Ruby" />
        <author>
            <name>griefworker</name>
        </author>
    </entry>
</feed>
EOF

たいへん便利だ。