web-dev-qa-db-ja.com

gemをテストするためのRSpecのセットアップ(Railsではありません)

RailsアプリケーションをテストするためにRSpecをセットアップするrspec-Railsのジェネレーターを追加するのは非常に簡単です。しかし、開発中のgemをテストするためにRSpecを追加するのはどうですか? 。Bundler(bundle gem my_gem)を使用して新しいgemの構造をセットアップし、*。gemspecを手動で編集した後、gemspecにs.add_development_dependency "rspec", ">= 2.0.0"を追加し、bundle installを実行しました。

RSpecを機能させるために次に行うべき素敵なチュートリアルはありますか?

152
Zardoz

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

Bundlerはgem開発を完全にサポートします。 gemを作成する場合、Gemfileに必要なonlyは次のとおりです。

source "https://rubygems.org"
gemspec

これは、bundle installを実行するときに依存関係についてgemspecファイル内を調べるようにBundlerに指示します。

次に、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
248
iain

上記のIainのソリューションは素晴らしい作品です!

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

require 'rspec/core/rake_task'

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

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

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

53
Mirko Froehlich

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

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

25
StevenNunez

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

Gemのルートにspecという名前のディレクトリを作成し、そこに仕様を入れます。おそらくrspecはすでにインストールされていますが、インストールしない場合は、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ファイルを作成して、gemのルートパスに配置します。私のものは次のようになります。

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

簡単、高速、きちんと!

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

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

6
wulftone