'Ah-ha!' Khoảnh khắc về thử nghiệm trong Ruby và Rails xuất hiện khi tôi thực sự ngồi xuống và đọc các tài nguyên dứt khoát về chủ đề này, các cuốn sách Rspec và Cucumber . Tôi đã chia sẻ sự khinh thường ban đầu của bạn về Dưa chuột, nhưng sau đó tôi nhận ra rằng tôi đang nhìn bức tranh từ góc độ khá sai.
Về cơ bản, Cucumber nói về BDD (phát triển theo hành vi) - bạn sử dụng Cucumber để lên kế hoạch cho các tính năng của mình, những gì bạn sẽ làm việc tiếp theo. Hmm, tiếp theo bạn muốn người dùng có thể quảng cáo bài viết trên một diễn đàn hoặc một cái gì đó (để lấy cắp một ví dụ;)) Vì vậy, bạn viết một cái gì đó đơn giản.
Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.
Lưu ý rằng không có tài liệu tham khảo cho bất kỳ mã nào liên quan trong đó khá nhiều. Điều đó đến trong các bước của bạn. Khi bạn cấu trúc lại mã của mình, bạn có thể phải thay đổi định nghĩa bước của mình, nhưng hành vi (tính năng của bạn) sẽ không bao giờ cần thay đổi.
Bây giờ mỗi khi bạn chạy tính năng Cucumber của mình, bạn sẽ được hướng dẫn cách kiểm tra tính năng này bằng cách sử dụng TDD (phát triển theo hướng kiểm tra). Điều này được thực hiện ở mức thấp hơn bằng cách sử dụng RSpec.
Lần chạy đầu tiên - định nghĩa bước đầu tiên của tôi là không xác định. Sao chép khối để xác định khối đó trong user_steps.rb hoặc thậm chí session_steps.rb vì nó liên quan đến người dùng và phiên của họ. Bây giờ, làm thế nào để bạn xác định rằng một người dùng đã đăng nhập? Bạn có thể đưa họ thông qua quá trình đăng nhập.
Given /^I am logged in$/ do
visit login_path
fill_in :name, :with => 'Joe'
fill_in :password, :with => 'Password'
click_button 'submit'
end
Nên tất cả đều hạnh phúc. Bước thứ hai.
Given /^I can see the post "(.+)"$/ do |name|
visit post_path(Post.find_by_name(name))
end
Lại khá dễ. Lưu ý rằng nếu chúng tôi hoàn toàn làm lại quá trình đăng nhập của mình hoặc cách bài viết của chúng tôi được xác định và hiển thị, chúng tôi không phải thay đổi hành vi. Bước thứ ba.
When /^I vote the post up$/ do
pending
end
Đây là nơi bạn bắt đầu nói về chức năng mới, nhưng bạn hoàn toàn không biết nó sẽ hoạt động như thế nào. Làm thế nào để bạn bỏ phiếu một bài viết lên? Bạn có thể nhấp vào hình ảnh của +1 hoặc một cái gì đó, bài đăng ajax cho bộ điều khiển, trả về JSON hoặc một số thứ khác. Vì vậy, bây giờ bạn có thể chuyển sang thử nghiệm Rspec thuần túy.
- Kiểm tra chế độ xem của bạn để đảm bảo hình ảnh +1 được hiển thị,
- Kiểm tra bộ điều khiển của bạn rằng nó hoạt động chính xác khi nhận được yêu cầu ajax đã cho đúng định dạng (cả đường dẫn hạnh phúc và không vui - điều gì xảy ra nếu nhận được ID bài đăng không hợp lệ? Điều gì xảy ra nếu người dùng đã sử dụng hết 25 lượt upvote trong một ngày? Nó có tăng số phiếu chính xác không?)
- Kiểm tra javascript của bạn rằng nó phản hồi chính xác khi được cung cấp một blob JSON đúng định dạng (nó có cập nhật hình ảnh +1 để hiển thị nó đã được sử dụng không? (Nghĩ về Google+ ở đây ...) Nó có hiển thị thông báo cảm ơn không? V.v. )
Tất cả những điều này không ảnh hưởng đến hành vi - nhưng khi bạn hoàn thành việc xử lý kiểm tra cấp thấp hơn, sẽ rất đơn giản để điền vào định nghĩa bước cho cách bỏ phiếu đăng bài. Nó có thể đơn giản như click_link '+1'
. Và các bước còn lại là kiểm tra kết quả, điều này một lần nữa nên đơn giản để làm. Và khi bạn hoàn thành, sau đó bạn biết tính năng của bạn đã hoàn tất và kết thúc. Nếu hành vi cần thiết thay đổi, bạn có thể điều chỉnh tính năng của mình, ngoài ra bạn có thể điều chỉnh mã triển khai của mình một cách an toàn tuyệt đối.
Tôi hy vọng điều này có ý nghĩa. Tất cả đều nằm ngoài đỉnh đầu của tôi, nhưng tôi nghĩ nó thể hiện sự khác biệt giữa BDD và TDD, và tại sao Cucumber và RSpec phục vụ các nhu cầu khác nhau.