query: tag:RSpec

 RSpecで現在時刻に関連するテストをするときに、Rails4.1からはTimecopを使わなくても ActiveSupport::Testing::TimeHelpers の to_travel というメソッドを使って現在時刻を設定することができます。

 たとえば、下記のように現在時刻を返すメソッドがあるとします。

ruby>>
class Foo
def now
Time.now
end
end
<<--

 正しく現在時刻を返しているかのテストは下記のように書けます。

ruby>>
travel_to Time.new(2014, 11, 24, 9, 30, 0) do
foo = Foo.new
expect(foo.now).to eq(Time.new(2014, 11, 24, 9, 30, 0))
end
<<--

 travel_toで現在時刻を設定しているので、expectで評価するときに決まった時間を書いて比較できます。

 ですがもしnowメソッドでDateTime.nowを返していると、to_travelでは対応できません。

ruby>>
class Foo
def now
DateTime.now # <- to_travelで設定した時間ではなく現在時刻が返る
end
end
<<--

 その場合にはやはりTimecopを使う必要があります。Gemfileには下記のようにgemを追加。

ruby>>
group :test do
gem 'timecop'
end
<<--

 テストは下記のように記述します。

ruby>>
Timecop.freeze(Time.new(2014, 11, 24, 9, 30, 0)) do
foo = Foo.new
expect(foo.now).to eq(Time.new(2014, 11, 24, 9, 30, 0))
end
<<--

 travel_to が対応しているのは Time.now と Date.today のみのようです。

 travel_to(date_or_time, &block)

 rails4.1からのtravel_toをrspecで使う

posted by akanuma akanuma on Tue 25 Nov 2014 at 00:03 with 0 comments

spec_helper.rbの中でRSpec.configure を呼び出している場合、
以下のような警告が出てくることがあります。

pre>>


DEPRECATION WARNING: you are using deprecated
behaviour that will be removed from RSpec 3.

You have set some configuration options after an
example group has already been defined. In RSpec 3,
this will not be allowed. All configuration should
happen before the first example group is defined.
The configuration is happening at:

/path/to/app/spec/spec_helper.rb:50


<<--

これは spec_helper.rb が何度も呼び出されてしまうことで、
configureブロックが2回以上呼び出されてしまうために起こる問題です。

そもそも Ruby の require は一度しかファイルを読み込まないように
なっていますが、読み込んだかどうか判定する基準となるのが
読み込み対象のファイルの絶対パスではなく、require に渡された引数であるため、同じファイルをrequireしてもパスの指定の仕方によって何度も読み込まれてしまうのです。

そこで、以下のように spec_helper.rb の先頭に記述することで、
二度読みを回避して警告されないようにすることができます。

ruby>>
$LOADED_FEATURES.push File.expand_path(FILE)
def require(path)
path = File.expand_path(path) if path =~ %r{^[./]}
super path
end
<<--

require を上書きして引数が "." か "/" で始まっている場合に expand_path を呼び出して正規化しています。
自分自身が呼び出される時のrequireは上書きできないので、
$LOADED_FEATURESに自分自身の絶対パスを追加しておきます。
require は $LOADED_FEATURESにpathが存在するする場合はスクリプトを読み込まなくなります。

posted by genki genki on Mon 30 May 2011 at 13:00 with 0 comments

「RSpec1.1.5からはautospecでautotest相当のことができる」ということを#rails-tokyoのIRCで教えてもらいました。autospec(autotest)を使うと、specファイル保存時にrspecが走ります。ので、rake specとかruby script/rails_spec spec/models/testmodel_spec.rbとか毎回打つ必要がなくなります。余計なウィンドウ移動が減って、コードに集中できるのはすばらしい!

 

--
12:15 (ysakaki) WindowsXPの環境でRSpeccのautotest動かせてる方いますか?
12:19 (yoshuki_) こんにちは、1.1.5からautospecコマンドになってますよ
12:22 (ysakaki) なんと!
12:23 (walf444) autospecついてるけど中でautotestをsystemでよんでるだけと角谷さんがいってたような気がする
12:25 (ysakaki) でけました!
--

walf444さんありがとう!

posted by ysakaki ysakaki on Tue 9 Dec 2008 at 17:45 with 0 comments

gem install rspec←エラーになる場合gemファイルを個別にダウンロードしてローカルインストールする。

gemファイルのダウンロード

  • http://rubyforge.org/frs/?group_id=797&release_id=27505 から「rspec-1.1.10.gem」をダウンロード
  • http://rubyforge.org/frs/?group_id=84&release_id=975 から「diff-lcs-1.1.2.gem」をダウンロード
  • http://rubyforge.org/frs/?group_id=505&release_id=2361 から「syntax-1.0.0.gem」をダウンロード
  • http://rubyforge.org/frs/?group_id=1513&release_id=27516 から「hoe-1.8.2.gem」をダウンロード
  • http://rubyforge.org/frs/?group_id=1024&release_id=27440 から「rubyforge-1.0.1.gem」をダウンロード
  • http://rubyforge.org/frs/?group_id=1024&release_id=27440 から「rake-0.8.3.gem」をダウンロード
  • http://rubyforge.org/frs/?group_id=1766&release_id=20259 から「win32console-1.1.0-i386-mswin32.gem」をダウンロード
  • http://rubyforge.org/frs/?group_id=1750&release_id=16551 から「rcov-0.8.1.2.0-mswin32.gem」をダウンロード

インストール

  • gem install rspec --local
  • gem install rspec-rails-1.1.10.gem --local
  • gem install win32console --local
  • gem install rcov-0.8.1.2.0-mswin32.gem --local

プロジェクトにrspec関連ファイルを生成

C:\workspace\product>ruby script/generate rspec
create lib/tasks/rspec.rake
create script/autospec
create script/spec
create script/spec_server
create spec
create spec/rcov.opts
create spec/spec.opts
create spec/spec_helper.rb
create stories
create stories/all.rb
create stories/helper.rb

posted by ysakaki ysakaki on Tue 25 Nov 2008 at 14:03 with 0 comments

NetBeans6以上ではRSpecの実行をサポートしていますが2byte文字の出力が文字化けする問題があります。

これを直すにはNetBeansインストールフォルダのC:\Program Files\NetBeans 6.5\etc\netbeans.confを開き、netbeans_default_optionsのオプションに-J-Dsun.java2d.noddraw=true -J-Dfile.encoding=UTF-8を加えて再起動します。

netbeans_default_options="-J-client -J-Xverify:none -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true -J-Dfile.encoding=UTF-8"

やったー!

rspec.GIF

参考:http://yakumo-yoh.seesaa.net/article/105420870.html

posted by ysakaki ysakaki on Tue 25 Nov 2008 at 12:58 with 0 comments

たまにrubyforgeが重くてgemがインストールできないことがある。
仕方ないので直接rubyforgeからgemをダウンロードしてローカルインストールする。(直接ダウンロードする分には普通にアクセスできる。。。)

gem install rspec --local

のように--localを指定すれば良い。ただし依存するgemも一式ダウンロードしておく必要があることに注意。

posted by ysakaki ysakaki on Tue 18 Nov 2008 at 11:44 with 0 comments

RSpecを使ってViewのスペックを書く時のメモ。

  • RSS Builder等を使っている場合も、renderでOk
    ruby>>
    render 'articles/index.rss.builder'
    <<--
  • renderはデフォルトではlayoutを伴わないので、必要に応じて明示的に指定する。
    ruby>>
    render 'articles/index', :layout => 'application'
    <<--
posted by genki genki on Wed 13 Aug 2008 at 15:19 with 0 comments

RSpecは面白そうだったのだけれど、なかなか移行する機会が無くて使っていなかったのですが、今は縁があってRSpecでViewのテストを書いています。

で、partialのテストをする場合のメモです。

ruby>>
require File.join(File.dirname(FILE), '../../spec_helper.rb')

describe '/foos/_form.html.erb' do
before do
render :partial => 'foos/form', :object => mock('form'),
:locals => {:bar => mock('bar')}
end

it "should be rendered successfully" do
response.should be_success
end
end
<<--

とりあえずこんな感じです。

See Also

posted by genki genki on Fri 16 May 2008 at 01:23 with 1 comment

ちょっと昔のコードのRSpecをAutotest対応にした時の作業ログです。

script/spec

ruby>>
#!/usr/bin/env ruby
$LOAD_PATH.unshift(File.expand_path(File.dirname(FILE) + "/../vendor/plugins/rspec/lib"))
require 'rubygems' #追加
require 'spec'
#::Spec::Runner::CommandLine.run(ARGV, STDERR, STDOUT, true, true)
::Spec::Runner::CommandLine.run(
::Spec::Runner::OptionParser.parse(ARGV, STDERR, STDOUT))
<<--

See Also

posted by genki genki on Wed 23 Apr 2008 at 23:26 with 0 comments