Thiết lập RSpec để kiểm tra đá quý (không phải Rails)


154

Thật dễ dàng với trình tạo rspec-rails được thêm vào để thiết lập RSpec để thử nghiệm ứng dụng Rails. Nhưng làm thế nào về việc thêm RSpec để thử nghiệm một viên ngọc đang phát triển? Tôi không sử dụng thợ kim hoàn hoặc các công cụ như vậy. Tôi chỉ sử dụng Bundler ( bundle gem my_gem) để thiết lập cấu trúc cho viên ngọc mới và chỉnh sửa * .gemspec theo cách thủ công. Tôi cũng đã thêm s.add_development_dependency "rspec", ">= 2.0.0"vào Gempec và đã làm a bundle install.

Có một số hướng dẫn tốt đẹp phải làm gì tiếp theo để RSpec hoạt động?


Tôi đoán tôi phải viết một :-) ... Ít nhất có hai viên đá quý đã tích hợp nó một cách độc đáo: act-as-taggable-on và act_as_geocodable.
Zardoz

Câu trả lời:


255

Tôi đã cập nhật câu trả lời này để phù hợp với thực tiễn tốt nhất hiện tại:

Bundler hỗ trợ phát triển đá quý một cách hoàn hảo. Nếu bạn đang tạo đá quý, điều duy nhất bạn cần có trong Gemfile của mình là:

source "https://rubygems.org"
gemspec

Điều này bảo Bundler xem xét bên trong tệp Gempec của bạn để biết các phụ thuộc khi bạn chạy bundle install.

Tiếp theo, hãy chắc chắn rằng RSpec là một phụ thuộc phát triển của đá quý của bạn. Chỉnh sửa gempec để nó đọc:

spec.add_development_dependency "rspec"

Tiếp theo, tạo spec/spec_helper.rbvà thêm một cái gì đó như:

require 'bundler/setup'
Bundler.setup

require 'your_gem_name' # and any other gems you need

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

Hai dòng đầu tiên bảo Bundler chỉ tải các viên đá quý bên trong gempec của bạn. Khi bạn cài đặt đá quý của riêng bạn trên máy của riêng bạn, điều này sẽ buộc thông số kỹ thuật của bạn sử dụng mã hiện tại của bạn, chứ không phải phiên bản bạn đã cài đặt riêng.

Tạo một thông số, ví dụ spec/foobar_spec.rb:

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

Tùy chọn: thêm một .rspectệp cho các tùy chọn mặc định và đặt nó vào đường dẫn gốc của gem:

--color
--format documentation

Cuối cùng: chạy thông số kỹ thuật:

$ rspec spec/foobar_spec.rb

75
Để công bằng, thay vào đó, bạn nên gọi lệnh init của RSpec để tạo các tệp khung xương cụ thể thay vì phải nhập chúng theo cách thủ công. Điều này sẽ đảm bảo khả năng tương thích với phiên bản RSpec mà bạn đang sử dụng: rspec --init
Attila Gyorffy

12
rspec --initkhông có sẵn khi tôi viết bài này, nhưng điểm tốt!
iain

Trên thực tế tôi đã tìm thấy cách tốt nhất để thực hiện các yêu cầu trong trình trợ giúp đặc tả là: yêu cầu 'rubygems' yêu cầu 'bundler / setup' Bundler.require (: default ,:
Development

Chính xác thì ba dòng mã của @ mkon hoạt động khác với ba dòng mã của iain như thế nào?
Nakilon

1
Các dòng từ @mkon sẽ yêu cầu tất cả các loại đá quý trong nhóm phát triển và thử nghiệm, trong khi cách tiếp cận của tôi là yêu cầu mọi loại đá quý theo cách thủ công. Vì bạn cần phải tự mình yêu cầu mỗi viên đá quý khi chế tác đá quý, tôi nghĩ rằng đó là cách tiếp cận tốt hơn / rõ ràng hơn mặc dù nó có thể là một công việc nhiều hơn một chút.
iain

53

Giải pháp của Iain ở trên hoạt động rất tốt!

Nếu bạn cũng muốn có một Rakefile, đây là tất cả những gì bạn cần:

require 'rspec/core/rake_task'

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

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

Kiểm tra RDoc cho RakeTask để biết các tùy chọn khác nhau mà bạn có thể tùy ý chuyển vào định nghĩa tác vụ.


26

Bạn có thể tạo đá quý mới của mình với rspec bằng cách chạy bundler gem --test=rspec my_gem. Không có thiết lập bổ sung!

Tôi luôn quên điều này. Nó được triển khai tại đây: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36


1
Khéo léo! Tuy nhiên, tôi nghĩ tên đá quý của bạn nên được chỉ định bằng dấu gạch dưới thay vì vỏ lạc đà. Mặt khác, Bundler tạo các tệp có chữ in hoa (Bundler 1.7.4)
Malte

Bundler phàn nàn về điều đó --test=rspec, nhưng nó vẫn hỏi tôi có muốn sử dụng Rspec khi tôi chạy không bundler gem my_gem.
Nicolas Mattia

7

Đây là một cách rẻ và dễ dàng (mặc dù không được đề xuất chính thức):

Tạo một thư mục trong thư mục gốc của đá quý của bạn được gọi spec, đặt thông số kỹ thuật của bạn vào đó. Bạn có thể đã cài đặt rspec, nhưng nếu bạn không, chỉ cần làm gem install rspecvà quên Gemfiles và gói.

Tiếp theo, bạn sẽ tạo một thông số kỹ thuật và bạn cần cho ứng dụng biết ứng dụng của bạn ở đâu, nơi chứa các tệp của bạn và bao gồm tệp bạn muốn kiểm tra (cùng với mọi phụ thuộc mà nó có):

# 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

Mở Terminal và chạy rspec:

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures

Nếu bạn muốn một số .rspectùy chọn yêu thích, hãy tạo một .rspectệp và đặt nó vào đường dẫn gốc của gem. Của tôi trông như thế này:

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

Dễ dàng, nhanh chóng, gọn gàng!

Tôi thích điều này bởi vì bạn không cần phải thêm bất kỳ sự phụ thuộc nào vào dự án của bạn, và toàn bộ điều này vẫn còn rất nhanh. bundle execlàm mọi thứ chậm lại một chút, đó là những gì bạn phải làm để đảm bảo rằng bạn đang sử dụng cùng một phiên bản rspec mọi lúc. 0,56 giây đó để chạy hai bài kiểm tra đã mất 99% khi máy tính của tôi tải lên rspec. Chạy hàng trăm thông số kỹ thuật nên cực kỳ nhanh. Vấn đề duy nhất bạn có thể gặp phải mà tôi biết là nếu bạn thay đổi các phiên bản của rspec và phiên bản mới không tương thích ngược với một số chức năng bạn đã sử dụng trong bài kiểm tra của mình, bạn có thể phải viết lại một số bài kiểm tra.

Điều này thật tuyệt nếu bạn đang thực hiện thông số kỹ thuật một lần hoặc có một số lý do chính đáng để KHÔNG bao gồm rspec trong gempec của bạn, tuy nhiên điều đó không tốt cho việc chia sẻ hoặc thực thi khả năng tương thích.


Có cách nào để không đặt AwesomeGem :: trước tên lớp bất cứ khi nào bạn đề cập đến một đối tượng thử nghiệm không? Hoặc khi bạn tạo một thử nghiệm mới như trong ví dụ của bạn.
Misha Slyusarev

1
Chắc chắn, bạn có thể đặt tên lớp của mình bằng một cái gì đó ngắn hơn, như Thing = AwesomeGem::Awesomehoặc bạn có thể thực hiện bài kiểm tra bên trong một mô-đun, nhưmodule AwesomeGem; it 'stuff' do; Awesome.new ... end; end
wulftone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.