Một đơn vị kiểm tra RSpec điển hình làm cho sử dụng rộng rãi của các khối của Ruby lồng nhau để cấu trúc mã và sử dụng DSL "ma thuật" để có thông số kỹ thuật đọc như báo cáo BDD:Rubocop 25 dòng kích thước khối và RSpec kiểm tra
describe Foo do
context "with a bar" do
before :each do
subject { Foo.new().add_bar }
end
it "looks like a baz" do
expect # etc
Trong một thông số lý tưởng, mỗi ví dụ có thể tương đối ngắn và chính xác. Tuy nhiên, có vẻ như thường có khối ngoài tăng lên 100 dòng cộng với, vì cấu trúc RSpec hoạt động theo cách này và không lấy nhiều ví dụ cụ thể, mỗi ví dụ có thể có một vài dòng thiết lập cụ thể, để có được các khối describe
cùng kích thước hoặc lớn hơn mã cho đối tượng được mô tả.
Việc nâng cấp gần đây của Rubocop đã đưa quy tắc mới vào hoạt động, các khối đó không được dài quá 25 dòng. Tôi không chắc chắn về lý do cho nó, bởi vì nó không được liệt kê trong Ruby style guide. Tôi có thể thấy lý do tại sao nó có thể là một điều tốt, và thêm vào ruleset mặc định. Tuy nhiên, sau khi nâng cấp, thử nghiệm Rubocop của chúng tôi thất bại nhiều lần với những thông điệp như tests/component_spec.rb:151:3: C: Block has too many lines. [68/25]
Với mã cụ metric như Rubocop, tôi thích để có một chính sách "Sử dụng các giá trị mặc định, liên kết để hướng dẫn phong cách, hoàn thành công việc . " Điều này rõ ràng là không thể, hai trong số các công cụ chất lượng dữ liệu cốt lõi của chúng tôi không đồng ý về cách tiếp cận bố cục mã - hoặc ít nhất đó là cách tôi giải thích kết quả, tôi không thấy bất cứ điều gì về bản chất sai với cách chúng tôi đã viết các thông số kỹ thuật.
Để trả lời, chúng tôi chỉ cần đặt quy tắc kích thước khối Rubocop thành ngưỡng cao. Nhưng điều đó khiến tôi tự hỏi - tôi đang thiếu gì? RSpec có sử dụng phương pháp tiếp cận được phân biệt mã ngay bây giờ hay không, và các tuỳ chọn hợp lý nào tôi có phải giảm kích thước khối trong các thử nghiệm RSpec của mình không? Tôi có thể thấy các cách để cơ cấu lại mã để tránh các khối lớn, nhưng chúng không có ngoại lệ xấu xí hacks nhằm hoàn toàn đáp ứng quy tắc của Rubocop, ví dụ: chia nhỏ tất cả các khối thành các chức năng trợ giúp:
def looks_like_a_baz
it "looks like a baz" do
expect # etc
end
end
def bar_context
context "with a bar" do
before :each do
subject { Foo.new().add_bar }
end
looks_like_a_baz
end
end
describe Foo do
bar_context
# etc
. . . Tôi có nghĩa là, đó là do-có thể, nhưng biến loạt các ví dụ spec vào chức năng trợ giúp theo cách này có vẻ là đối diện của phương pháp tiếp cận có thể đọc được khuyến khích bởi thiết kế RSpec.
Tôi có thể làm gì khác ngoài cách tìm cách bỏ qua nó không?
Câu hỏi gần đây nhất mà tôi có thể tìm thấy về chủ đề này ở đây là RSpec & Rubocop/Ruby Style Guide và điều này có thể giải quyết bằng cách chỉnh sửa mẫu thử.
Các [thiết lập mặc định] (https://github.com /bbatsov/rubocop/blob/v0.46.0/config/default.yml#L1156-L1162) loại trừ các tệp trong 'spec /'. – Stefan
@Stefan: Ah, do đó, việc sử dụng 'test /' của chúng tôi đã cho chúng ta thấy điều đó. . . đó là điều tốt để biết. Nó có nghĩa là các tác giả Rubocop thừa nhận một điều gì đó khác với mã RSpec, và chúng ta nên làm như vậy. –