160

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

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

4

4 に答える 4

261

現在のベストプラクティスに一致するように、この回答を更新しました。

Bundlerはgem開発を完全にサポートします。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行は、gemspec内のgemのみをロードするようにBundlerに指示します。独自の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
于 2010-12-09T19:23:52.870 に答える
53

上記のIainのソリューションはうまく機能します!

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

require 'rspec/core/rake_task'

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

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

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

于 2011-01-08T03:38:45.940 に答える
27

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

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

于 2014-07-19T21:50:49.747 に答える
7

安くて簡単な(公式には推奨されていませんが)方法は次のとおりです。

ジェムのルートにと呼ばれるディレクトリを作成しspec、そこにスペックを配置します。おそらくすでにrspecがインストールされていますが、インストールされていない場合は、gem install rspecGemfilesと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を含めない正当な理由がある場合は便利ですが、共有を有効にしたり、互換性を強制したりするのにはあまり適していません。

于 2012-03-17T20:52:54.610 に答える