hirapi's blog

ちゃんとしたふりをする

Hanami公式入門ガイド日本語訳【5】Getting Started(4)

http://hanamirb.org/guides/1.1/getting-started/#writing-our-first-test

初めてのテストを書く

ブラウザでアプリケーションを開いたときに最初に目にする画面は、ルーティングが何も定義されていないときに表示されるデフォルトページです。

HanamiはWebアプリケーション開発手法としてビヘイビア駆動開発(BDD)を推奨しています。
最初の自作の画面を表示させるために、高次元の機能テストを書きましょう:

# spec/web/features/visit_home_spec.rb
require 'features_helper'

describe 'Visit home' do
  it 'is successful' do
    visit '/'

    page.body.must_include('Bookshelf')
  end
end

注意してほしいのは、Hanamiは最初からBDDの開発フローをサポートしていますが、特定のテスト用フレームワークに縛られているわけでもなければ、特別な統合システムやライブラリを備えているわけでもありません。

ここではMinitest(デフォルト)を使っていきますが、プロジェクトを作る際に --test=rspec オプションをつけることでRSpecを使うこともできます。
そうすればHanamiはRSpecのためのヘルパーやスタブのファイルを生成します。
(※ データベースのURLを微調整する必要があるときは .env.test を確認してください)

このコマンドを実行して、テスト用のデータベースにスキーママイグレーションしなければなりません:

% HANAMI_ENV=test bundle exec hanami db prepare

見ての通り、コマンドを実行する環境を指定するには環境変数 HANAMI_ENV をセットします。

リクエストを受ける

今テストを実行すると、失敗することがわかります:

% bundle exec rake test
Run options: --seed 44759

# Running:

F

Finished in 0.018611s, 53.7305 runs/s, 53.7305 assertions/s.

  1) Failure:
Homepage#test_0001_is successful [/Users/hanami/bookshelf/spec/web/features/visit_home_spec.rb:6]:
Expected "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Not Found</title>\n  </head>\n  <body>\n    <h1>Not Found</h1>\n  </body>\n</html>\n" to include "Bookshelf".

1 runs, 1 assertions, 1 failures, 0 errors, 0 skips

それではこのテストを通しましょう。
そのために必要な必要なコードをひとつずつ書き足していきましょう。

初めに足すのはルーティングです:

# apps/web/config/routes.rb
root to: 'home#index'

アプリケーションのルートを home コントローラの index アクションに指定しました(詳しくはルーティングの解説を見てください)。
次にindexアクションを作ります。

# apps/web/controllers/home/index.rb
module Web::Controllers::Home
  class Index
    include Web::Action

    def call(params)
    end
  end
end

これは何のビジネスロジックも実行しない空のアクションです。
それぞれのアクションには対応するビューがあり、ビューはRubyのオブジェクトであり、リクエストを満たすために追加する必要があります。

# apps/web/views/home/index.rb
module Web::View::Home
  class Index
    include Web::View
  end
end

アクションと同様にこのビューも空であり、テンプレートをレンダリングするだけです。
これが、テストを通すために編集する必要のあるファイルです。
先頭に "bookshelf" と追加するだけです。

# apps/web/templates/home/index.html.erb
<h1>Bookshelf</h1>

変更を保存し、テストをまた走らせてください。そうすると今度は通ります。
やったね!

Run options: --seed 19286

# Running:

.


Finished in 0.011854s, 84.3600 runs/s, 168.7200 assertions/s.

1 runs, 2 assertions, 0 failures, 0 errors, 0 skips