Làm thế nào để chạy thử nghiệm RSpec?


306

Tôi có tập tin sau:

/spec/controllers/groups_controller_spec.rb

Tôi sử dụng lệnh nào trong terminal để chạy chỉ định spec đó và trong thư mục nào tôi chạy lệnh?

Tập tin đá quý của tôi:

# Test ENVIRONMENT GEMS
group :development, :test do
    gem "autotest"
    gem "rspec-rails", "~> 2.4"
    gem "cucumber-rails", ">=0.3.2"
    gem "webrat", ">=0.7.2"
    gem 'factory_girl_rails'
    gem 'email_spec'
end

Tập tin đặc tả:

require 'spec_helper'

describe GroupsController do
  include Devise::TestHelpers

  describe "GET yourgroups" do
    it "should be successful and return 3 items" do

      Rails.logger.info 'HAIL MARRY'

      get :yourgroups, :format => :json
      response.should be_success
      body = JSON.parse(response.body)
      body.should have(3).items # @user1 has 3 permissions to 3 groups
    end
  end
end

Bạn có thể chạy các thử nghiệm của mình như gói exec rspec ./spec/controllers/groups_controll_spec.rb:6, nó chỉ chạy thử nghiệm cụ thể này. Thêm thông tin ở đây: kolosek.com/rails-rspec-setup
Nesha Zoric

bundle exec rspec spec --helpwil cho bạn câu trả lời:
Thomas Decaux

Câu trả lời:


15

Không chắc chắn điều này có sẵn ong bao lâu nhưng có một cấu hình Rspec để chạy lọc - vì vậy bây giờ bạn có thể thêm nó vào spec_helper.rb:

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

Và sau đó thêm một thẻ tập trung vào it, contexthoặc describeđể chạy chỉ khối:

it 'runs a test', :focus do
  ...test code
end

Tài liệu RSpec:

https://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration#filter_run_when_matching-instance_method


1
Điều này đòi hỏi phải thay đổi cơ sở hạ tầng. Và nhớ để thay đổi nó trở lại. Tôi khuyên bạn không nên làm điều này và chỉ sử dụng các rspeclệnh để chạy thông số kỹ thuật với tham số thích hợp để chỉ ra điều đó
Michael Durrant

482

Tôi thường làm:

rspec ./spec/controllers/groups_controller_spec.rb:42

Trường hợp 42đại diện cho dòng thử nghiệm tôi muốn chạy.

EDIT1:

Bạn cũng có thể sử dụng thẻ. Xem tại đây .

EDIT 2:

Thử:

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42

Cảm ơn đã cố gắng rằng nó không hoạt động khi tôi thực hiện rake spec /spec/path...:XX Tôi gặp lỗi / System / L Library / Frameworks / Repy.framework / Warions / 1.8 / usr / bin / ruby ​​-S bundle exec rspec ./spec/controllers/groups_controller_spec.rb ./spec/controllers/incoming_mails_controller_spec.rb ./spec/lib/mailing_job/mailingjob_find_reply_spec.rb ./spec/models/group_model_spec.rb ./spec/models/user_model_spec.rb
AnApprentice

Nếu tôi thử chỉ sử dụng RSPEC, tôi sẽ gặp lỗi này: "$ rspec spec / controls / Groups_controll_spec.rb: 19 /L Library / Repub / Salad / 8 /ems / basler-1.0.0 / lib / basler / r nb.rb: 27 : trong `setup ': Bạn đã kích hoạt rspec-core 2.6.2, nhưng Gemfile của bạn yêu cầu rspec-core 2.6.0. Cân nhắc sử dụng gói thực thi. (Gem :: LoadError)"
AnApprentice

Bạn có thể thử "gói exec rspec spec / controls / Groups_controll_spec.rb: 19" trong trường hợp đó
muffinista

exec exec bó nhưng tại sao? Đó có phải là một cách hack để tránh điều đó?
AnApprentice

11
Đây không phải là một bản hack, nó đảm bảo bạn sử dụng chính phiên bản mà bạn đã khai báo trong gemfile của mình. Trong trường hợp của bạn, chỉ đơn giản là rspecthất bại vì phiên bản trên hệ thống của bạn gần đây hơn phiên bản trong gemfile của bạn.
bắt đầu

67

Với Cào:

rake spec SPEC=path/to/spec.rb

(Tín dụng đi đến câu trả lời này . Hãy bỏ phiếu cho anh ta.)

EDIT (nhờ @cirosantilli): Để chạy một kịch bản cụ thể trong thông số kỹ thuật, bạn phải cung cấp một mẫu biểu thức khớp chính xác phù hợp với mô tả.

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""

11
Đây là câu trả lời ưu việt vì nó sử dụng lệnh 'rake spec' chứ không phải lệnh 'rspec'. Điều đó có nghĩa là cơ sở dữ liệu kiểm tra được khởi tạo lại đúng cách mỗi lần (điều này không xảy ra nếu bạn sử dụng 'rspec ...')
jpw

Bạn có thể sử dụng SPEC=path/to/spec.rb:42để chạy thử nghiệm trên số dòng nhất định, mặc dù có vẻ như bất kỳ it_behaves_likethử nghiệm nào cũng sẽ được chạy (lỗi?).
mgold

61

Bạn có thể truyền regex cho lệnh spec sẽ chỉ chạy itcác khối khớp với tên bạn cung cấp.

spec path/to/my_spec.rb -e "should be the correct answer"

Cập nhật 2019: Rspec2 chuyển từ lệnh 'spec' sang lệnh 'rspec'.


Cảm ơn tôi đã thử nhưng nó lỗi với: $ rake spec spec / controls / đến_mails_controll_spec.rb -e "nên thành công và trả lại 3 mục" cào bỏ! (eval): 1: in `standard_rake_options ': lỗi biên dịch (eval): 1: lỗi cú pháp, tIDENTIFIER không mong đợi, hy vọng $ end sẽ thành công và trả về 3 mục
AnApprentice

Cập nhật với những ý tưởng tập tin spec thực tế?
AnApprentice

Nếu bạn có một lỗi biên dịch, thông số kỹ thuật của bạn không phải là ruby ​​hợp lệ. Hãy chắc chắn rằng bạn không bỏ lỡ một dosau it, contexthoặc describetuyên bố.
Douglas F Shearer

1
Đó là "thông số kỹ thuật", không phải "thông số cào".
muffinista

đây phải là câu trả lời đúng, liên quan đến số dòng là sai nghiêm trọng - bất kỳ trường hợp nào
Eugen Mayer

27

Có nhiều lựa chọn:

rspec spec                           # All specs
rspec spec/models                    # All specs in the models directory
rspec spec/models/a_model_spec.rb    # All specs in the some_model model spec
rspec spec/models/a_model_spec.rb:nn # Run the spec that includes line 'nn'
rspec -e"text from a test"           # Runs specs that match the text
rspec spec --tag focus               # Runs specs that have :focus => true
rspec spec --tag focus:special       # Run specs that have :focus => special
rspec spec --tag focus ~skip         # Run tests except those with :focus => true

23

Phương pháp ưa thích của tôi để chạy các thử nghiệm cụ thể hơi khác nhau - Tôi đã thêm các dòng

  RSpec.configure do |config|
    config.filter_run :focus => true
    config.run_all_when_everything_filtered = true
  end

Để tập tin spec_helper của tôi.

Bây giờ, bất cứ khi nào tôi muốn chạy một thử nghiệm cụ thể (hoặc bối cảnh hoặc thông số kỹ thuật), tôi chỉ cần thêm thẻ "tiêu điểm" vào đó và chạy thử nghiệm của mình như bình thường - chỉ có (các) thử nghiệm tập trung mới chạy. Nếu tôi loại bỏ tất cả các thẻ tiêu điểm, run_all_when_everything_filteredcú đá vào và chạy tất cả các bài kiểm tra như bình thường.

Nó không hoàn toàn nhanh chóng và dễ dàng như các tùy chọn dòng lệnh - nó yêu cầu bạn chỉnh sửa tệp cho bài kiểm tra bạn muốn chạy. Nhưng nó mang lại cho bạn nhiều quyền kiểm soát hơn, tôi cảm thấy.


Tôi chắc chắn thích phong cách này, vì tôi thường chạy thử nghiệm thông qua Rubymine / intelliJ. Tôi cũng thích phương pháp này vì nó tương tự như sử dụng fit / xit trong hoa nhài / với gulp
Wired00

9

@apneadiving trả lời là một cách gọn gàng để giải quyết điều này. Tuy nhiên, bây giờ chúng ta có một phương thức mới trong Rspec 3.3. Chúng ta chỉ có thể chạy rspec spec/unit/baseball_spec.rb[#context:#it]thay vì sử dụng số dòng. Lấy từ đây:

RSpec 3.3 giới thiệu một cách mới để xác định các ví dụ [...]

Ví dụ: lệnh này:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] Nhóm sẽ chạy ví dụ hoặc nhóm thứ 2 và thứ 4 được xác định trong nhóm cấp cao nhất thứ 1 được xác định trong spec / unit / chày_spec.rb.

Vì vậy, thay vì thực hiện rspec spec/unit/baseball_spec.rb:42ở đâu (thử nghiệm trong dòng 42) là thử nghiệm đầu tiên, chúng ta chỉ có thể thực hiện rspec spec/unit/baseball_spec.rb[1:1]hoặc rspec spec/unit/baseball_spec.rb[1:1:1]tùy thuộc vào cách lồng vào trường hợp thử nghiệm.


5

Trong đường ray 5,

Tôi đã sử dụng cách này để chạy tệp thử nghiệm duy nhất (tất cả các thử nghiệm trong một tệp)

rails test -n /TopicsControllerTest/ -v

Tên lớp có thể được sử dụng để khớp với tệp mong muốn TopicsControllerTest

Lớp học của tôi class TopicsControllerTest < ActionDispatch::IntegrationTest

Đầu ra:

nhập mô tả hình ảnh ở đây

Nếu bạn muốn, bạn có thể điều chỉnh regex để khớp với phương thức kiểm tra đơn \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v

4

Đối với mô hình, nó sẽ chỉ chạy trường hợp trên dòng số 5

bundle exec rspec spec/models/user_spec.rb:5

Đối với bộ điều khiển: nó sẽ chỉ chạy trường hợp trên dòng số 5

bundle exec rspec spec/controllers/users_controller_spec.rb:5

Đối với mô hình tín hiệu hoặc bộ điều khiển loại bỏ số dòng từ trên

Để chạy trường hợp trên tất cả các mô hình

bundle exec rspec spec/models

Để chạy trường hợp trên tất cả các bộ điều khiển

bundle exec rspec spec/controllers

Để chạy tất cả các trường hợp

 bundle exec rspec 

3

Chạy các lệnh từ thư mục gốc của dự án của bạn:

# run all specs in the project's spec folder
bundle exec rspec 

# run specs nested under a directory, like controllers
bundle exec rspec spec/controllers

# run a single test file
bundle exec rspec spec/controllers/groups_controller_spec.rb

# run a test or subset of tests within a file
# e.g., if the 'it', 'describe', or 'context' block you wish to test
# starts at line 45, run:
bundle exec rspec spec/controllers/groups_controller_spec.rb:45

1

bắt đầu với rspec 2 bạn có thể sử dụng như sau:

# in spec/spec_helper.rb
RSpec.configure do |config|
  config.filter_run :focus => true
  config.run_all_when_everything_filtered = true
end

# in spec/any_spec.rb
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end

0

Cho rằng bạn đang ở trong dự án rails 3 với rspec 2, Từ thư mục gốc của rails:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

chắc chắn nên làm việc Tôi cảm thấy mệt mỏi khi gõ nó vì vậy tôi đã tạo một bí danh để rút ngắn 'bundle exec rspec' thành 'bersp'

'bundle exec' là để nó tải môi trường đá quý chính xác được chỉ định trong tệp đá quý của bạn: http://gembundler.com/

Rspec2 đã chuyển từ lệnh 'spec' sang lệnh 'rspec'.


0

Tôi sử dụng đá quý bảo vệ này để tự động chạy thử nghiệm của tôi. Nó thực hiện kiểm tra sau khi tạo hoặc cập nhật các hoạt động trên tập tin thử nghiệm.

https://github.com/guard/guard-test

hoặc thường bạn có thể chạy bằng lệnh sau

rspec spec / bộ điều khiển / nhóm_controll_spec.rb


0

Bạn có thể làm một cái gì đó như thế này:

 rspec/spec/features/controller/spec_file_name.rb
 rspec/spec/features/controller_name.rb         #run all the specs in this controller

0

Bạn có thể dùng

 rspec spec/controllers/groups_controller_spec.rb:<line_number>

số dòng phải là số dòng của dòng 'mô tả' hoặc 'nó' để nó sẽ chạy các bài kiểm tra có trong khối cụ thể đó. thay vào đó, nó sẽ thực thi tất cả các dòng bên cạnh line_number.

ngoài ra, bạn có thể tạo khối với tên tùy chỉnh và sau đó chỉ có thể thực hiện các khối đó.


0

Một lỗi phổ biến khác là vẫn có hoặc đã nâng cấp ứng dụng Rails cũ lên Rails 5+ và được đặt require 'spec_helper'ở đầu mỗi tệp kiểm tra. Điều này nên thay đổi thành require 'rails_helper'. Nếu bạn đang thấy hành vi khác nhau giữa tác vụ cào ( rake spec) và khi bạn chạy một thông số duy nhất ( rspec path/to/spec.rb), đây là một lý do phổ biến

giải pháp tốt nhất là

1) đảm bảo bạn đang sử dụng require 'rails_helper'ở đầu mỗi tệp spec của bạn - không phải kiểu require 'spec_helper' 2 cũ hơn ) sử dụng rake spec SPEC=path/to/spec.rbcú pháp

phong cách cũ hơn rspec path/to/spec.rbtôi nghĩ nên được cộng đồng coi là không phổ biến vào thời điểm này vào năm 2020 (nhưng tất nhiên bạn sẽ khiến nó hoạt động, những cân nhắc khác sang một bên)

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.