Tôi hiện đang đấu tranh một chút cố gắng giữ thông số kỹ thuật của bộ điều khiển DRY và gọn gàng và xuống một xác nhận cho mỗi ví dụ. Tôi đang chạy vào một số khó khăn đặc biệt là với nơi để đặt cuộc gọi yêu cầu điều khiển thực tế trong một cấu trúc lồng nhau để phù hợp với các trường hợp cạnh khác nhau.Thông số kỹ thuật điều khiển DRY với RSpec
Dưới đây là một ví dụ, đơn giản hóa để chứng minh vấn đề:
describe MyController do
let(:item) { Factory(:item) }
subject { response }
describe "GET #show" do
before(:each) do
get :show
end
context "published item" do
it { should redirect_to(success_url) }
end
context "unpublished item" do
before(:each) do
item.update_attribute(published: false)
end
it { should redirect_to(error_url) }
end
end
end
Rõ ràng đây là một ví dụ giả tạo, nhưng nó minh họa những gì tôi muốn làm và những gì không làm việc. Chủ yếu, khối before
trong bối cảnh "chưa xuất bản" là vấn đề. Điều gì xảy ra là thay đổi tôi thực hiện cho dữ liệu thiết lập thực sự xảy ra sau khi gọi cuộc gọi get
do cách ngữ cảnh được lồng nhau, vì vậy ví dụ trong bối cảnh đó thực sự hoạt động với kịch bản ban đầu chứ không phải là kịch bản tôi dự định.
Tôi hiểu tại sao điều này xảy ra và bối cảnh làm tổ như thế nào. Tôi đoán những gì tôi muốn như để có một số cách để nói cho RSpec những gì tôi muốn nó chạy ngay sau bất kỳ before
móc nào đúng trước bất kỳ xác nhận nào trong một ngữ cảnh nhất định. Điều này sẽ là hoàn hảo cho thông số kỹ thuật điều khiển. Tôi muốn tận dụng lợi thế của việc lồng trong thông số bộ điều khiển của tôi để dần dần xây dựng các biến thể của các trường hợp cạnh mà không cần phải phân tán cuộc gọi get
hoặc thậm chí gọi đến số trợ giúp do_get
vào mỗi xác nhận it
của tôi. Điều này đặc biệt khó chịu để giữ đồng bộ với bất kỳ macro tùy chỉnh it_should
nào tôi đang sử dụng.
Hiện tại có bất kỳ điều gì trong RSpec thực hiện việc này không? Có bất kỳ thủ đoạn nào tôi có thể sử dụng để đến gần không? Nó có vẻ hoàn toàn phù hợp với cách tôi đã nhìn thấy rất nhiều người viết thông số kỹ thuật điều khiển của họ; từ những gì tôi đã tìm thấy, mọi người đã giải quyết cơ bản để có những người giúp đỡ do_get
được gọi trước mỗi xác nhận. Có cách nào tốt hơn?
Điểm tốt. Độ dài thêm có thể đáng giá để giữ cho thông số kỹ thuật rõ ràng, ngay cả khi lệnh gọi 'get' vẫn được lặp lại. Tuy nhiên, nó có cảm giác giống như thông số kỹ thuật điều khiển, có một trường hợp sử dụng rất cụ thể trong việc xác định một phản ứng với một hành động REST, bằng cách nào đó có thể làm giảm sự lặp lại như vậy. –
Chris - Tôi đồng ý rằng một số loại phím tắt sẽ tốt đẹp và tôi mở cho ý tưởng này, nhưng tôi chưa thấy cái nào duy trì những gì tôi cảm thấy là mức độ rõ ràng phù hợp. Nếu bạn có bất kỳ ý tưởng nào, bằng mọi cách, vui lòng gửi yêu cầu tính năng tới https://github.com/rspec/rspec-rails/issues. –