2011-08-17 23 views
23

Trang của tôi phải chứa liên kết trông giống như <a href="/desired_path/1">Click to go</a>.Làm thế nào để sử dụng assert_select để kiểm tra sự hiện diện của một liên kết nhất định?

Bạn sẽ kiểm tra điều đó bằng cách sử dụng assert_select như thế nào? Tôi muốn kiểm tra sự hiện diện của thẻ a với href="/desired_path/1". Làm thế nào để bạn kiểm tra các thuộc tính của một thẻ?

Có tài nguyên nào để giải thích cách sử dụng assert_select không? Tôi đã đọc tài liệu Hướng dẫn và API nhưng không tìm ra. Có cách nào tốt hơn được đề xuất để thực hiện việc này không?

Tôi đang làm việc trong Rails 3 và sử dụng khung kiểm tra tích hợp sẵn.

Cảm ơn.

Trả lời

13

Bạn có thể chuyển bất kỳ bộ chọn CSS nào để khẳng định chọn. Vì vậy, để kiểm tra các thuộc tính của thẻ, bạn sử dụng [attrname=attrvalue]:

assert_select("a[href=/desired_path/1]") do |elements| 
    # Here you can test that elements.count == 1 for instance, or anything else 
end 
+0

này không còn hoạt động trong Rails 5, cũng không phải, tôi tin rằng, trong Rails 4. Xem [câu trả lời của tôi] (https://stackoverflow.com/a/48394216/187833) cho cú pháp hiện tại. – jm3

22

Trong assert_select, bạn cũng có thể sử dụng một dấu hỏi cho các giá trị thuộc tính, và sau đó làm theo với một chuỗi để phù hợp.

assert_select "a[href=?]", "/desired_path/1"

Có một cách khác để sử dụng assert_select đó là thân thiện hơn, đặc biệt là nếu bạn muốn kết hợp một chuỗi hoặc regexp mẫu phần:

assert_select "a", :href => /acebook\.com\/share/

+4

Biểu mẫu thứ hai dường như chỉ hoạt động đối với văn bản của phần tử chứ không phải thuộc tính. Nó bỏ qua điều kiện href khi tôi thử nó. – Shadwell

+0

Có, điều này hoạt động, tuy nhiên, tôi không thấy bất kỳ tài liệu nào về nó (ngoại trừ một ví dụ và một đề cập đi qua). – gamov

+6

Như @Shadwell đã đề cập, biểu mẫu ** 2 ** không hoạt động (Rails 3.2.15). Thật không may, nó không khiến khẳng định thất bại, tôi tin rằng tùy chọn: href bị bỏ qua một cách thầm lặng. Nếu bất cứ ai muốn chứng minh điều này cho chính mình, viết một cái gì đó mà nên thất bại trong các đối số biểu thức thường xuyên: href và xem cách assert_select vẫn vượt qua. –

15

Đây là cách bạn có thể khẳng định một số của mọi thứ về liên kết sử dụng assert_select. Đối số thứ 2 có thể là một chuỗi hoặc một biểu thức chính quy để kiểm tra thuộc tính href chống lại:

# URL string (2nd arg) is compared to the href attribute thanks to the '?' in 
    # CSS selector string. Also asserts that there is only one link matching 
    # the arguments (:count option) and that the link has the text 
    # 'Your Dashboard' (:text option) 
    assert_select '.menu a[href=?]', 'http://test.host/dashboard', 
     { :count => 1, :text => 'Your Dashboard' } 

    # Regular expression (2nd arg) tests the href attribute thanks to the '?' in 
    # the CSS selector string. 
    assert_select '.menu a[href=?]', /\Ahttp:\/\/test.host\/dashboard\z/, 
     { :count => 1, :text => 'Your Dashboard' } 

Đối với những cách khác bạn có thể sử dụng assert_select, đây là những ví dụ lấy từ actionpack Rails 3.2.15 docs (xem tập tin actionpack-3.2.15/lib/action_dispatch/testing/assertions/selector.rb):

# At least one form element 
    assert_select "form" 

    # Form element includes four input fields 
    assert_select "form input", 4 

    # Page title is "Welcome" 
    assert_select "title", "Welcome" 

    # Page title is "Welcome" and there is only one title element 
    assert_select "title", {:count => 1, :text => "Welcome"}, 
     "Wrong title or more than one title element" 

    # Page contains no forms 
    assert_select "form", false, "This page must contain no forms" 

    # Test the content and style 
    assert_select "body div.header ul.menu" 

    # Use substitution values 
    assert_select "ol>li#?", /item-\d+/ 

    # All input fields in the form have a name 
    assert_select "form input" do 
    assert_select "[name=?]", /.+/ # Not empty 
    end 
+1

Bạn sẽ thử nghiệm như thế nào cho nhiều thuộc tính? Giống như 'a [href =? data-foo = "bar"]] '? – Mohamad

+1

@Mohamad, tôi nghĩ rằng điều này sẽ làm điều đó, trong đó mỗi thuộc tính đi vào các dấu ngoặc vuông riêng: 'assert_select 'a [href =?] [Data-foo =" bar "]', 'http: // test. host/dashboard'' –

2

Đối với bất kỳ ai sử dụng assert_select đến từ Rails 4.1 và nâng cấp lên Rails 4.2.

Trong 4.1 này làm việc:

my_url = "/my_results?search=hello" 
my_text = "(My Results)" 
assert_select 'a[href=?]', my_url, my_text 

Trong 4.2 này đưa ra một lỗi: "deprecation CẢNH BÁO: khẳng định không chạy vì một selector css hợp lệ bất ngờ '(' sau khi '[:. Bình đẳng," \ "/ my_results \" "]"

tôi đã thay đổi cú pháp này và nó làm việc !:

assert_select 'a[href=?]', my_url, { text: my_text } 

Eliots trả lời ở trên đã giúp tôi, cảm ơn :)

+0

Tìm kiếm câu trả lời cho vấn đề này ở khắp mọi nơi. Cảm ơn bạn đã đăng bài này! – Kelly

+0

Cảm ơn. Trong 4.2 tham số thứ 2 'my_url' phải là một String. Vì vậy, nếu bạn đang kiểm tra đối với một số nguyên, hãy nhớ sử dụng 'to_s'. Ví dụ: 'assert_select 'a [foo-id =?]', Foo.id.to_s' –

0
assert_select 'a' do |link| 
    expect(link.attr('href').to_s).to eq expected_url 
end 
0

Câu hỏi đặt ra đặc biệt hỏi: “Làm thế nào để bạn kiểm tra các thuộc tính của [một yếu tố]?”

Những câu trả lời khác ở đây sử dụng assert_select theo những cách mà không còn làm việc trong hiện tại Rails/MiniTest.Theo issue này, khẳng định về nội dung thuộc tính hiện đang sử dụng hơn XPath-y 'trận đấu' cú pháp sau:

assert_select "a:match('href', ?)", /jm3\.net/ 
Các vấn đề liên quan