/var/log/messages

Jan 19, 2014 - 2 minute read - Comments - rails

Rspec 後付けで書く

Rails API Testing Best Practices によれば Request Spec で HTTP Status および Response Body を、とあります。これで試しに作成してみることに。

スデに実装は書いてしまっているので

rails g rspec:response

とかになるのかな。とりあえず導入から。

Gemfile に以下を追加、なのか。

group :development, :test do
  gem 'rspec-rails', '~> 3.0.0.beta'
end

で、

$ bundle install
$ rails g rspec:install

とのこと。

で、試験追加を、と思って Generators 見てみるに以下とのこと。

  • scaffold
  • model
  • controller
  • helper
  • view
  • mailer
  • observer
  • integration

むむ、と言いつつ Rails API Testing Best Practices を見てみるに API Testing is integration Testing という記述あり。成程。

以下かな。

$ rails g rspec:integration Hoge

かくにんしてみます。

$ rails g rspec:integration hoge
      create  spec/requests/hoges_spec.rb

あと、Redis な mock が必要ですね。FactoryGirl とかも必要なのかな。

mock_redis かくにん

Gemfile に以下を追加して

group :development, :test do
  gem 'rspec-rails', '~> 3.0.0.beta'
  gem "mock_redis", "~> 0.10.0"
end

bundle install して rails c で確認。しようとしたのですが Redis.stub は console からは無理らしい。

とりあえず

POST な試験を書いてみます。その前に spec/spec_helper.rb に以下を追加。

require 'mock_redis'

RSpec.configure do |config|
  config.before(:each) do
    redis_instance = MockRedis.new
    Redis.stub(:new).and_return{ redis_instance }
    Redis.current = Redis.new
  end
end

で、簡単な試験をでっちあげてみたのですが Redis.stub が云々と言われたので

#    Redis.stub(:new).and_return{ redis_instance }
    allow(Redis).to receive(:new).and_return(redis_instance)

みたいにしてます。エラーメッセージ (?) が以下なカンジでした。

Using stub from rspec-mocks’ old :should syntax without explicitly enabling the syntax is deprecated. Use the new :expect syntax or explicitly enable :should instead.

あと、Redis な mock がちゃんと動いてるのか確認してみます。まずローカルな Redis.current を掃除しておいて

> Redis.current.flushall

試験実行。

$ bundle exec rspec spec

で、rails c から以下。

> Redis.current.keys
=> []

大丈夫みたいです。

試験を一通り書いたら

リファクタ実施の方向にて。