2012年5月18日金曜日

sinatra (8) - コードカバレッジ -

(7)の続き。
テストを実施すると必要になってくるコードカバレッジ。
今回はRuby 1.9で使用できるSimpleCovを使用します。

Gemfile

source :rubygems

gem 'sinatra', require: 'sinatra/base'
gem 'slim'
gem 'sass'
gem 'unicorn'
gem 'mongoid'
gem 'bson_ext'

group :development do
  gem 'sinatra-reloader', require: 'sinatra/reloader'
end

group :test do
  gem 'rspec'
  gem 'rack-test', require: 'rack/test'
  gem 'guard-rspec'
  gem 'simplecov', require: false
end

spec/sepc_helper.rb

require 'bundler/setup'
Bundler.require :default, :test

require 'simplecov'
SimpleCov.start

require 'app'
require 'models'

RSpec.configure do |config|
  config.include Rack::Test::Methods
end
$ bundle install
$ bundle exec guard
これでテストするたびにカバレッジを計測することができます。なお、前回のソースだと
Coverage report generated for RSpec to /home/kan/workspace/template/coverage. 22 / 23 LOC (95.65%) covered.
と表示されて100%に達していません。
coverageディレクトリ以下に結果のhtmlが生成されているので確認してみると、app.rbのget '/css/:file.css'...のブロックがテストされていないことがわかります。
簡単なテストを追加してみます。

spec/app_spec.rb

require 'spec_helper'

shared_examples_for "response code" do
  it { should be_ok }
end

describe MyApp do

  def app
    @app ||= MyApp
  end

  context "when get '/'" do
    before do
      get '/'
    end
    subject { last_response }
    it_behaves_like "response code"
    its(:body) { should include("Hello World!") }
  end

  context "when get '/css/style.css'" do
    before do
      get '/css/style.css'
    end
    subject { last_response }
    it_behaves_like "response code"
  end

  describe "MongoDB access" do
    before do
      Game.destroy_all if Game.exists?
      Game.create(title: "GOD EATER BURST", platform: "PSP")
    end
    context "when get '/games/title'" do
      before { get 'games/title' }
      subject { last_response }
      its(:body) { should == "GOD EATER BURST" }
    end
    context "when get '/games/platform'" do
      before { get 'games/platform' }
      subject { last_response }
      its(:body) { should == "PSP" }
    end
  end
end
再度テストを実行すると、カバレッジが100%に達すると思います。

0 件のコメント:

コメントを投稿