GSpec(Railsではない)をテストするようにRSpecを設定する


154

rspec-railsのジェネレーターを追加すると、RailsアプリケーションをテストするためのRSpecを設定するのが非常に簡単になります。しかし、開発中に宝石をテストするためのRSpecを追加するのはどうでしょうか?私は宝石商やそのような道具を使っていません。Bundler(bundle gem my_gem)を使用して新しいgemの構造を設定し、*。gemspecを手動で編集しました。またs.add_development_dependency "rspec", ">= 2.0.0"、gemspecに追加してを行いましたbundle install

RSpecを機能させるために次に何をすべきかについての良いチュートリアルはありますか?


私は1つ書く必要があると思います:-) ...少なくともそれをうまく統合している2つの宝石があります:acts-as-taggable-onとacts_as_geocodableです。
Zardoz

回答:


255

現在のベストプラクティスに合わせて、この回答を更新しました。

Bundlerはgemの開発を完全にサポートしています。あなたが宝石を作成する場合は、唯一のあなたのGemfileに持っている必要なものは以下の通りであります:

source "https://rubygems.org"
gemspec

これは、実行時に依存関係をgemspecファイル内で調べるようにBundlerに指示しますbundle install

次に、RSpecがgemの開発依存関係であることを確認します。次のようにgemspecを編集します。

spec.add_development_dependency "rspec"

次に、次のspec/spec_helper.rbようなものを作成して追加します。

require 'bundler/setup'
Bundler.setup

require 'your_gem_name' # and any other gems you need

RSpec.configure do |config|
  # some (optional) config here
end

最初の2行は、Bundlerにgemspec内のgemのみをロードするように指示しています。独自のgemを独自のマシンにインストールすると、個別にインストールしたバージョンではなく、仕様で現在のコードが使用されます。

スペックを作成します。例spec/foobar_spec.rb

require 'spec_helper'
describe Foobar do
  pending "write it"
end

オプション:.rspecデフォルトオプションのファイルを追加し、gemのルートパスに配置します。

--color
--format documentation

最後に、スペックを実行します。

$ rspec spec/foobar_spec.rb

75
公平を期すためには、あなたの代わりにRSpecののinitコマンド発行ではなく、手動でそれらを入力するよりもスペックスケルトンファイルを生成する必要がありますこれは、あなたが使用していることをRSpecのバージョンとの互換性を保証するであろう: rspec --init
アッティラGyörffy

12
rspec --init私がこれを書いたときには利用できませんでしたが、良い点です!
iain 2012年

実際、specヘルパーでrequireを実行する最良の方法は次のとおりです。require 'rubygems' require 'bundler / setup' Bundler.require(:default、:development)
mkon

@mkonの3行のコードは、iainの3行のコードとどのように異なるのですか?
Nakilon、2016

1
@mkonの行には、開発グループとテストグループのすべてのgemが必要ですが、私のアプローチでは、すべてのgemを手動で要求します。ジェムを作成するときは、すべてのジェムを自分で要求する必要があるので、少し手間がかかるかもしれませんが、これはより良い/明確なアプローチだと思います。
iain '25

53

上記のイアンの解決策はうまくいきます!

Rakefileも必要な場合は、これで十分です。

require 'rspec/core/rake_task'

RSpec::Core::RakeTask.new(:spec)

# If you want to make this the default task
task default: :spec

オプションでタスク定義に渡すことができるさまざまなオプションについては、RDoc for RakeTaskを確認してください。


26

を実行すると、rspecを使用して新しいgemを生成できますbundler gem --test=rspec my_gem。追加のセットアップは不要です。

私はいつもこれを忘れています。ここに実装されています:https : //github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36


1
きちんと!ただし、宝石の名前は、キャメルケースではなくアンダースコアで指定する必要があると思います。それ以外の場合、バンドラーは大文字でファイルを作成します(バンドラー1.7.4)
Malte

バンドラーは不満を言った--test=rspecが、それでも私が走っbundler gem my_gemたときにRspecを使いたいかどうか尋ねてきた。
Nicolas Mattia

7

これは安価で簡単な方法です(ただし、公式には推奨されていません)。

宝石のルートにと呼ばれるディレクトリを作成しspec、スペックをそこに配置します。おそらく既にrspecがインストールされていますが、インストールしていない場合は、a gem install rspecを実行してGemfilesとbundlerを忘れてください。

次に、仕様を作成し、アプリの場所とファイルの場所を伝え、テストするファイルを(依存関係とともに)含める必要があります。

# spec/awesome_gem/awesome.rb
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
$: << File.join(APP_ROOT, 'lib/awesome_gem') # so rspec knows where your file could be
require 'some_file_in_the_above_dir' # this loads the class you want to test

describe AwesomeGem::Awesome do
  before do
    @dog = AwesomeGem::Awesome.new(name: 'woofer!')
  end
  it 'should have a name' do
    @dog.name.should eq 'woofer!'
  end
  context '#lick_things' do
    it 'should return the dog\'s name in a string' do
      @dog.lick_things.should include 'woofer!:'
    end
  end
end

ターミナルを開いてrspecを実行します。

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures

いくつかの.rspecオプションを使いたい場合は、.rspecファイルを作成し、それを宝石のルートパスに配置します。鉱山は次のようになります。

# .rspec
--format documentation --color --debug --fail-fast

簡単、高速、きちんと!

プロジェクトに依存関係を追加する必要がなく、全体が非常に高速であるため、これが好きです。 bundle exec少し遅くなります。これは、常に同じバージョンのrspecを使用していることを確認するために行う必要があることです。2つのテストを実行するのにかかる0.56秒は、コンピューターがrspecをロードするまでに99%かかっていました。何百ものスペックを実行すると、非常に高速になるはずです。私が認識している唯一の問題は、rspecのバージョンを変更し、新しいバージョンがテストで使用した一部の関数と下位互換性がない場合、一部のテストを書き直す必要がある場合があることです。

これは、1回限りの仕様を実行している場合や、gemspecにrspecを含めない正当な理由がある場合に適していますが、共有を有効にしたり、互換性を強制したりするにはあまり適していません。


テストオブジェクトを参照するときは常に、クラス名の前にAwesomeGem ::を置かない方法はありますか?または、例のように新しいテストを作成するとき。
ミシャSlyusarev

1
もちろん、クラス名を何か短いものに設定することもThing = AwesomeGem::Awesome、モジュール内でテストを行うこともできますmodule AwesomeGem; it 'stuff' do; Awesome.new ... end; end
wulftone
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.