2011-08-17 14 views
23

Moja strona powinna zawierać link, który wygląda jak <a href="/desired_path/1">Click to go</a>.Jak używać assert_select do testowania obecności danego linku?

Jak można to sprawdzić za pomocą assert_select? Chcę sprawdzić obecność znacznika a za pomocą href="/desired_path/1". Jak testujesz atrybuty tagu?

Czy są jakieś zasoby, aby wyjaśnić, jak używać assert_select? Przeczytałem dokumentację Przewodników i API, ale nie zrozumiałem. Czy są jakieś zalecane lepsze sposoby robienia tego?

Pracuję w Rails 3 i przy użyciu wbudowanego środowiska testowego.

Dzięki.

Odpowiedz

13

Możesz przekazać dowolny selektor CSS do assert_select. Tak, aby przetestować atrybut znacznika, należy użyć [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

To już nie pracuje w Rails 5, ani, jak sądzę, w Rails 4. Patrz [moja odpowiedź] (https://stackoverflow.com/a/48394216/187833) dla bieżącej składni. – jm3

22

W assert_select, można również użyć znaku zapytania dla wartości atrybutu, a następnie postępuj zgodnie z ciągiem, aby dopasować.

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

Jest jeszcze jeden sposób na wykorzystanie assert_select który jest bardziej przyjazny, zwłaszcza jeśli chcesz dopasować częściowy ciąg lub regexp wzoru:

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

+4

Druga forma wydaje się działać tylko dla tekstu elementu, a nie atrybutów. Zignorował stan href kiedy go wypróbowałem. – Shadwell

+0

Tak, działa to jednak, nie widzę żadnego dokumentu na ten temat (z wyjątkiem przykładu i wzmianki). – gamov

+6

Jak wspomniano w @Shadwell, formularz ** 2nd ** nie działa (Rails 3.2.15). Niestety, nie powoduje to niepowodzenia asercji, uważam, że opcja: href jest cicho ignorowana. Jeśli ktokolwiek chce to udowodnić na własną rękę, napisz coś, co powinno zawieść w: href argument wyrażenia regularnego i zobacz, jak nadal przechodzi assert_select. –

15

Oto w jaki sposób można dochodzić numer rzeczy o linku za pomocą assert_select. 2. argument może być albo String lub wyrażenie regularne, aby przetestować atrybut href przed:

# 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' } 

innych sposobów można użyć assert_select, oto przykłady zaczerpnięte z actionpack Rails 3.2.15 Docs (zobacz plik 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

Jak testowałbyś wiele atrybutów? Jak 'a [href =? data-foo = "bar"]] '? – Mohamad

+1

@Mohamad, myślę, że to zrobi, gdzie każdy atrybut ma swój własny nawias kwadratowy: 'assert_select 'a [href =?] [Data-foo =" bar "]', 'http: // test. host/dashboard'' –

2

Dla każdego używającego assert_select pochodzącego z Rails 4.1 i aktualizującego do Rails 4.2.

w punkcie 4.1 okazało się to:

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

4,2 dało to błąd „amortyzacyjne uwaga: stwierdzenie nie było wykonywane z powodu nieprawidłowej selektora css nieoczekiwane«(»po„[:. Równy” \ "/ my_results \" "] '"

Zmieniłem składni do tego i to działało !:

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

Eliots odpowiedź powyżej pomógł mi, dziękuję :)

+0

Szukałem odpowiedzi na ten problem wszędzie. Dzięki za zamieszczenie tego! – Kelly

+0

Dzięki. W 4.2 drugi parametr "my_url" musi być ciągiem. Jeśli więc sprawdzasz w stosunku do liczby całkowitej, pamiętaj o użyciu 'to_s'. Na przykład '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

Chodzi konkretnie pyta: „Jak można przetestować atrybuty [element]?”

innych odpowiedzi tutaj użyć assert_select w sposób, który nie jest już pracują w bieżącym Rails/MiniTest.Jak na tym issue, twierdzenia o zawartości atrybutów teraz użyć tego więcej XPath-y „mecz” składnię:

assert_select "a:match('href', ?)", /jm3\.net/ 
Powiązane problemy