新年一発目からマニアックです^^;
このブログにも散々投稿してる道の駅巡りですが、好きが高じて
道の駅の情報(位置など)を取得できるAPIを作成しました。
道の駅の情報(位置など)を取得できるAPIを作成しました。
GithubにMichiEkiとして公開してます。
現在は道の駅の検索くらいしかできませんが、今後色々機能を
追加していきたい所です。
追加していきたい所です。
本題
こっからが本題ですが^^;、このMichiEkiはrackアプリケーションとなっており
リクエストを投げるとJSON形式でデータが返ってきます。
rackup
コマンドで起動します。起動したMichiEkiアプリに対して色々なリクエストを投げるとJSON形式でデータが返ってきます。
今回はこのRackアプリケーションのテストを書いていこうと思います。
テストは
テストは
RSpec
を使ってテストします。- 環境準備
bundle init
を行い、できたGemfile
に以下gemを追加しますgem 'rake'
gem 'rspec'
gem 'sham_rack'
↑で
このgemがスタブやモックの働きをしてくれます。
sham_rack
というgemをインストールしてますが、このgemがスタブやモックの働きをしてくれます。
インストールと初期化
$ bundle install
$ rspec --init
ここまでで以下のようなツリー構成になっているかと思います
.
├── Gemfile
├── Gemfile.lock
└── spec
└── spec_helper.rb
サンプルとして
spec/hello.rb
を作成します# coding: utf-8
class HelloApp
def call(env)
case env['REQUEST_METHOD']
when 'GET'
[
200,
{ 'Content-Type' => 'text/html' },
['<html><body><p>hello</p></body></html>']
]
end
end
end
単純にリクエストが来たら
次に
hello
を返しているだけのものです。次に
config.ru
を作成します# coding: utf-8
require_relative 'hello'
run HelloApp.new
ここまで作成できたら、一度試しに実行確認。
$ bundle exec rackup -o 0.0.0.0
http://localhost:9292/
にアクセスしてhello
が表示されればOKsham_rackを使ったテスト
Rackアプリケーションをテストする際に便利な
sham_rack
というのがありますsham_rackとは?
HTTPリクエストをホストに投げる前にフックすることができ、
モックやテスト用のドメインとしても使うことができます。
モックやテスト用のドメインとしても使うことができます。
実際に
sham_rack
を使ってテストしていきます。spec_helper.rb
に以下を追加します。require 'sham_rack'
require_relative '../hello'
RSpec.configure do |config|
・・・
end
ShamRack.at('sham.rack.example.com').rackup do
run HelloApp.new
end
これで
フックされHelloAppが呼び出されます。
sham.rack.example.com
に対してリクエストを送るとフックされHelloAppが呼び出されます。
hello.rbのテスト
hello_spec.rb
を以下内容で作成しますrequire "spec_helper"
require 'open-uri'
RSpec.describe HelloApp do
it 'test hello' do
result = open("http://sham.rack.example.com").read
p result
expect(result).to eq '<html><body><p>hello</p></body></html>'
end
end
http://sham.rack.example.com
にリクエストを送ると<html><body><p>hello</p></body></html>
が返ってくることを期待します
実行してみます。
$ bundle exec rspec
Run options: include {:focus=>true}
All examples were filtered out; ignoring {:focus=>true}
"<html><body><p>hello</p></body></html>"
.
Finished in 0.02474 seconds (files took 0.17352 seconds to load)
1 example, 0 failures
ちゃんとリクエストがフックされ
HelloApp#call
が呼ばれ、<html><body><p>hello</p></body></html>
が返ってきてます。
すごいっす!!!API作るなんて...
返信削除私もはやくこーゆーのを作れるぐらいになりたいっす!!
APIと言ってるんですが、全然大した事やってなくて、
削除使ってくれる人がいればいいな〜くらいのレベルです^^;
いやいや、じゅうぶん大した事でしょ!
返信削除新年早々、マニアックな記事で良いっすね。。
ありがとうございます。
削除あえて新年からマニアックにいってみましたw