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を機能させるために次に行うべき素敵なチュートリアルはありますか?
現在のベストプラクティスに合わせてこの回答を更新しました。
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
上記の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 を確認してください。
bundler gem --test=rspec my_gem
を実行すると、rspecを使用して新しいgemを生成できます。追加のセットアップは不要です!
これはいつも忘れます。ここに実装されています: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36
以下は、安価で簡単な(公式には推奨されていません)方法です。
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を含めない正当な理由がある場合に便利ですが、共有を有効にしたり互換性を強制したりするにはあまり適していません。