2012-06-25 27 views

Trả lời

37

tôi khuyên bạn nên thay vì cố gắng để xác định vị trí theo phong cách css, bạn thay vì viết bài kiểm tra của bạn để tìm ra tên lớp css.

Bằng cách này bạn có thể thay đổi kiểu dáng css cơ bản trong khi vẫn giữ nguyên lớp và các bài kiểm tra của bạn sẽ vẫn vượt qua.

Tìm kiếm kiểu dáng cơ bản là giòn. Kiểu thay đổi thường xuyên. Căn cứ vào rspecs của bạn trên việc tìm kiếm các yếu tố phong cách cụ thể làm cho thử nghiệm của bạn giòn hơn - họ sẽ có nhiều khả năng thất bại khi tất cả các bạn làm là thay đổi giao diện của div.

Căn cứ vào các bài kiểm tra của bạn về việc tìm các lớp css làm cho các bài kiểm tra trở nên mạnh mẽ hơn. Nó cho phép họ đảm bảo mã của bạn hoạt động chính xác trong khi không yêu cầu bạn thay đổi chúng khi bạn thay đổi kiểu trang.

Trong trường hợp này, một tùy chọn có thể là xác định một lớp css có tên .hidden đặt display:none; trên một phần tử để ẩn nó.

Như thế này:

css:

.hidden { 
    display:none; 
} 

html:

<div class="hidden">HIDE ME!</div> 

Capybara:

it {should have_css('div.hidden') } 

Capybara này chỉ trông cho một div mà có hidden class - bạn có thể làm cho matcher này tinh vi hơn nếu bạn cần.

Nhưng điểm chính là - gắn các kiểu vào các tên lớp css, sau đó buộc các bài kiểm tra của bạn vào các lớp, chứ không phải các kiểu.

+11

Nói chung đây là lời khuyên tốt, với ít nhất một ngoại lệ: nếu bạn đang cố gắng kiểm tra xem một thành phần có hiển thị với người dùng hay không.Nếu trường hợp đó xảy ra, thì việc kiểm tra sự hiện diện của một lớp CSS là điều sai phải làm vì sẽ kiểm tra việc thực hiện thay vì kết quả và điểm thử nghiệm là cho phép bạn thay đổi việc triển khai và đảm bảo rằng bạn có được cùng một kết quả. Nếu thực tế bạn đang kiểm tra xem một phần tử có hiển thị với người dùng hay không, hãy xem câu trả lời của luacassus. –

+0

@toasterlovin - bằng cách sử dụng các lớp css tốt có thể giúp với điều này, ví dụ nó là điển hình để xem các nhà phát triển trước tiên tiến sử dụng một lớp như '.is-hidden {display: none; } 'hoặc tương tự, sau đó được thêm bằng javascript hoặc được hiển thị khi tải trang. Thử nghiệm cho sự tồn tại của lớp này sẽ khá mạnh mẽ; Tôi muốn nói vấn đề một phần nằm với thực hành xấu kết thúc trước ('$ (elem) .css ('display', 'none');' ví dụ) –

+0

Tôi đã cố gắng để có được sự khác biệt giữa kiểm tra việc thực hiện (không phần tử có một lớp sẽ làm cho nó ẩn đi) và kiểm tra điều thực sự bạn quan tâm (là phần tử ẩn). IMO, đây là một khía cạnh quan trọng để viết các bài kiểm tra hữu ích. Kiểm tra điều thực tế bạn quan tâm có nghĩa là bạn có thể cấu trúc lại mọi thứ về cách bạn nhận được kết quả và kiểm tra của bạn sẽ cho bạn biết nếu bạn đã tái cấu trúc đúng cách. Mặt khác, nếu bạn kiểm tra việc triển khai, thì thử nghiệm sẽ trở thành vô dụng ngay sau khi bạn thay đổi việc triển khai. –

12

Bạn có thể sử dụng đối sánh has_css?. Nó có thể chấp nhận các tùy chọn :visible. Để biết thêm chi tiết bạn có thể kiểm tra tài liệu: http://rdoc.info/github/jnicklas/capybara/Capybara/Node/Matchers#has_css%3F-instance_method

Ví dụ, bạn có thể thử:

it { should have_css('div.with-some-class', :visible => true) }

+0

hãy cẩn thận với ': visible => true' - kết quả có thể không chính xác: [http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#visible%3F-instance_method] (http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#visible%3F-instance_method) – bershika

+0

Chỉ muốn chỉ ra cách sử dụng tùy chọn ': visible' có thể gây ngạc nhiên nếu sử dụng' true 'hoặc' false'. Tôi đã tìm thấy bằng cách sử dụng 'visible:: visible' hoặc' visible:: hidden' rõ ràng hơn. [Xem chi tiết] (https://github.com/jnicklas/capybara/commit/83742b008f0719082beb8f6703bc70ba956815fc#diff-da1771677e47ff6a7a70b8119e14102dR58) và [thảo luận về các tùy chọn biểu tượng này] (https://github.com/jnicklas/capybara/issues/944) – EricC

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