webmockを使ってRailsのAPIのアプリケーションをモック化したので、その備忘録です。
モックとは、簡単に言うとテスト用のダミーアプリケーションです。
APIを利用したサービスのテストで使うことがあります。
今回は以前作ったこちらのAPIアプリをモック化しました。
https://qiita.com/Lmachi/items/464c3cbb9eeb86457935
##スタブ作成
require 'webmock'
module BookMarkStub
WebMock.enable!
WebMock.allow_net_connect!
WebMock.stub_request(:get, 'http://www.example.com/bookmarks' )
.to_return(
body: File.read("#{Rails.root}/test/fixtures/files/get_bookmarks.json"),
status: 200,
headers: { 'Content-Type' => 'application/json' }
)
end
スタブを作成します。
スタブもモック同様にテスト用のダミーです。
モックとスタブの違いについてはこちらの記事をご覧ください。
https://qiita.com/hirohero/items/3ab63a1cdbe32bbeadf1
stub_requestでダミーのエンドポイントを指定しています。
body: File.read()にモックに返すダミーデータのパスを書きます。Bodyを返さない場合はこの行は不要です。
WebMock.allow_net_connect!はstub登録したホスト以外へのアクセスを許可します。
これがないと以下のエラーが発生します。
Real HTTP connections are disabled.
Unregistered request: GET http://localhost:3000/bookmarks with headers
{'Accept'=>'application/json',
'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
'User-Agent'=>'Ruby'}
You can stub this request with the following snippet: stub_request
(:get, "http://localhost:3000/bookmarks")
. with( headers: { 'Accept'=>'application/json',
'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
'User-Agent'=>'Ruby' })
. to_return(status: 200, body: "", headers: {})
registered request stubs: stub_request
(:get, "http://localhost:3001/bookmarks")
============================================================
##ダミーデータ作成
[
{
"id": 1,
"title": “hoge”,
"url": "https://www.hoge.co.jp/",
"comment": "テスト",
"created_at": "2021-02-11T09:15:09.492Z",
"updated_at": "2021-02-11T09:15:09.492Z"
},
{
"id": 2,
"title": “hogehoge”,
"url": "https://www.hogehoge.co.jp/",
"comment": "test",
"created_at": "2021-02-11T09:15:24.677Z",
"updated_at": "2021-02-11T09:15:24.677Z"
}
]
json形式でダミーデータを用意します。
ダミーデータの中身は、元になるAPIサーバーで確認してください。
##スタブを読み込ませる
require "#{Rails.root}/test/stub/bookmark_stub"
class ApplicationResource < ActiveResource::Base
self.include_format_in_path = false
end
application_resource.rbを作成し、bookmark_stub.rbを読み込ませます。
##モデル編集
class Bookmark < ApplicationResource
self.site = 'http://www.example.com/'.freeze
end
ApplicationResourceを読み込ませ、self.siteをダミーサイトに書き換えます。
以上でモック化は完了です。
##参考
https://qiita.com/ogawatti/items/58bd4fe1180a0acfdd5e