2011-07-26 46 views
12

Điều này khiến tôi bất ngờ…Ví dụ chia sẻ RSpec không được chia sẻ

Có vẻ như bạn không thể sử dụng cùng tên cho 2 nhóm mẫu được chia sẻ rspec ở bất kỳ đâu trong dự án của bạn. Nếu bạn làm vậy, khi bạn chạy rake spec (để chạy tất cả các thông số kỹ thuật), thì rspec than phiền rằng một nhóm ví dụ được chia sẻ đã được khai báo với một tên không duy nhất.

Điều này xảy ra ngay cả khi các cuộc gọi đến shared_examples_for được chứa trong một khối mô tả (người ta cho rằng phạm vi các ví dụ).

Lúc đầu, tôi đã cố gắng giải quyết vấn đề này bằng cách thay đổi tên của các nhóm mẫu (không lý tưởng, nhưng tôi có thể sống với nó).

Nhưng điều này đã trở thành vấn đề hơn khi tôi muốn đưa ra nhóm ví dụ cho một tệp riêng biệt để tôi có thể chia sẻ nó giữa nhiều tệp spec.

Thông số kỹ thuật hoạt động tốt khi chạy trong sự cô lập, nhưng khi tôi chạy bộ phần mềm, rspec than phiền.

`ensure_shared_example_group_name_not_taken': \ 
Shared example group 'a person' already exists (ArgumentError) 

Chắc chắn đây là vấn đề thường gặp.

Có điều gì tôi thiếu ở đây không?

Trả lời

11

Kể từ rspec 2.6, các ví dụ được chia sẻ là toàn cầu. Bạn có thể khai báo chúng trong một nhóm ví dụ, nhưng chúng không nằm trong nhóm đó.

+0

Cảm ơn David. Bất kỳ đề xuất nào về cách sử dụng các ví dụ được chia sẻ trong nhiều tệp spec? Có vẻ như việc gọi 'shared_examples_for' bên ngoài khối' describe' khiến 'rake' thất bại. –

+0

Xin lỗi. Đo không phải sự thật. Nó không thành công ngay cả khi tôi quấn nó trong 'mô tả'. Rõ ràng nó là một cái gì đó để làm với yêu cầu một tập tin. –

+4

Mục đích là xác định chúng trong một tệp và sử dụng chúng trong các tệp khác, do đó, nó chắc chắn sẽ hoạt động nếu bạn có chúng trong một tệp khác. Quy ước là giữ chúng trong một tệp theo đặc tả/hỗ trợ (ví dụ: spec/support/shared_examples_for_xyz.rb) và yêu cầu các tệp đó từ spec/spec_helper.rb. –

2

Có một số lời khuyên trong các tài liệu chính thức về cách tốt nhất để xử lý này:

https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-examples

TL; DR

Vâng, ví dụ chia sẻ mang tính toàn cầu. Thực hành tốt nhất cho Ruby On Rails: Đặt các ví dụ được chia sẻ trong spec/support/foo_bar_shared_examples.rb và chỉ bắt đầu viết shared_example thẳng, không bao gói trong bất kỳ khối describe hoặc cách khác.

Các vấn đề liên quan