gem을 테스트하기 위해 RSpec 설정 (Rails 아님)


155

추가 된 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을 작동시키기 위해 다음에해야 할 멋진 튜토리얼이 있습니까?


나는 하나를 작성해야한다고 생각한다 :-) ... 적어도 그것을 이미 멋지게 통합 한 두 개의 보석이있다 : acts-as-taggable-on과 acts_as_geocodable.
Zardoz 2010

답변:


257

현재 모범 사례와 일치하도록이 답변을 업데이트했습니다.

Bundler는 gem 개발을 완벽하게 지원합니다. 당신이 보석을 만드는 경우 에만 당신은 당신의 Gemfile에 있어야합니다 것은 다음과 같다 :

source "https://rubygems.org"
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

처음 두 줄은 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
Attila Györffy

12
rspec --init이 글을 썼을 때는 사용할 수 없었지만 좋은 지적입니다!
iain

실제로 사양 도우미에서 요구 사항을 수행하는 가장 좋은 방법은 다음과 같습니다. require 'rubygems'require 'bundler / setup'Bundler.require (: default, : development)
mkon

@mkon의 세 줄 코드가 iain의 세 줄 코드와 정확히 어떻게 다르게 작동합니까?
Nakilon

1
@mkon의 라인은 개발 및 테스트 그룹의 모든 gem을 요구하는 반면, 제 접근 방식은 모든 gem을 수동으로 요구하는 것입니다. 보석을 만들 때 모든 보석을 직접 요구해야하기 때문에 조금 더 작업이 되더라도 더 좋고 명확한 접근 방식이라고 생각합니다.
iain

52

위의 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을 확인하십시오 .


26

를 실행하여 rspec으로 새 gem을 생성 할 수 있습니다 bundler gem --test=rspec my_gem. 추가 설정이 없습니다!

나는 항상 이것을 잊는다. 여기에서 구현됩니다 : https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36


1
산뜻한! 그러나 보석 이름은 낙타 대소 문자 대신 밑줄로 지정해야한다고 생각합니다. 그렇지 않으면 Bundler를가 대문자로 파일 (Bundler를 1.7.4)을 작성
말테

Bundler는 불평을 --test=rspec했지만 실행했을 때 Rspec을 사용하고 싶은지 여전히 묻습니다 bundler gem my_gem.
Nicolas Mattia 2015

7

다음은 저렴하고 쉬운 방법입니다 (공식적으로 권장되지는 않음).

gem의 루트에라는 디렉토리를 만들고 spec거기에 사양을 넣으십시오. 이미 rspec이 설치되어있을 수도 있지만 설치되어 있지 않다면 gem install rspecGemfiles와 번 들러를 잊어 버리십시오.

다음으로 사양을 만들고 앱이 어디에 있는지, 파일이 어디에 있는지 알려주고 테스트 할 파일을 포함해야합니다 (있는 종속성과 함께).

# 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을 사용하고 있는지 확인해야합니다. 두 개의 테스트를 실행하는 데 걸린 0.56 초는 내 컴퓨터가 rspec을로드하는 데 걸리는 시간에 99 %가 소요되었습니다. 수백 개의 사양을 실행하는 것은 매우 빠릅니다. 내가 아는 유일한 문제는 rspec 버전을 변경하고 새 버전이 테스트에서 사용한 일부 기능과 하위 호환되지 않는 경우 일부 테스트를 다시 작성해야 할 수 있다는 것입니다.

이것은 일회성 사양을 수행하거나 gemspec에 rspec을 포함하지 않을 충분한 이유가있는 경우 좋지만 공유를 활성화하거나 호환성을 강화하는 데는 그리 좋지 않습니다.


테스트 개체를 참조 할 때마다 AwesomeGem :: 클래스 이름 앞에 넣지 않는 방법이 있습니까? 또는 예제와 같이 새 테스트를 만들 때.
Misha 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.