酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

[Gem] Webmock RSpecのWebアクセスのモックを作成してくれる超便利Gem [Rails]

Where?WebからデータをダウンロードするプログラムのRspecで、Webにいちいちアクセスしたくない場合に重宝するのが、「webmock」です。これを使えばある時点のデータを使えるので、テスト結果が更新されて変わるような事態を防ぐことができます!

bblimke/webmock · GitHub


Gemのインストール

いつもどおりGemfileに以下を追加して、bundle installを実行してください。

1
2
3
4
group :test do
  # HTTP requests用のモックアップを作ってくれる
  gem 'webmock'
end

Webモックの使い方

使い方もいたって簡単です。いつものRSpecファイルに次のような記述を追加を追加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
require "spec_helper"
require "webmock/rspec"
# これをつけておくとEXAMPLE_SITE_URL以外は普通にWebにアクセス
# すべてのhttpリクエストを行わない場合は、下を削除
WebMock.allow_net_connect!

EXAMPLE_SITE_URL = "http://www.iana.org/domains/example/"

describe "" do
  before do
    # EXAMPLE_SITE_URL にアクセスしたら EXAMPLE_SITE_BODY を返すスタブを作成
    stub_request(:get, EXAMPLE_SITE_URL).to_return({:body => EXAMPLE_SITE_BODY,:status => 200})
    @doc = Nokogiri::HTML(open(EXAMPLE_SITE_URL))
    @title = @doc.search("title").inner_text
  end

  subject { @title }
  it { should == "Koreha Example Domain" }
end

# テスト用のフィード
EXAMPLE_SITE_BODY = <<-EOF
<!doctype html>
<html>
<head>
  <title>Koreha Example Domain</title>

  <meta charset="utf-8" />
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <style type="text/css">
  body {
    background-color: #f0f0f2;
    margin: 0;
    padding: 0;
    font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

  }
  div {
    width: 600px;
    margin: 5em auto;
    padding: 3em;
    background-color: #fff;
    border-radius: 1em;
  }
  a:link, a:visited {
    color: #38488f;
    text-decoration: none;
  }
  @media (max-width: 600px) {
    body {
      background-color: #fff;
    }
    div {
      width: auto;
      margin: 0 auto;
      border-radius: 0;
      padding: 1em;
    }
  }
  </style>
</head>

<body>
<div>
  <h1>Example Domain</h1>
  <p>This domain is established to be used for illustrative examples in documents. You do not need to
    coordinate or ask for permission to use this domain in examples, and it is not available for
    registration.</p>
  <p><a href="http://www.iana.org/domains/special">More information...</a></p>
</div>
</body>
</html>
EOF

もし、興味があれば是非チャレンジしてみて下さい!

bblimke/webmock · GitHub

Special Thanks

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

変更来歴

01/22 14:55 Gemfileのgroupをdevelopment => testに変更

おすすめの書籍