2011-08-17 4 views
23

La mia pagina dovrebbe contenere un collegamento che assomiglia a <a href="/desired_path/1">Click to go</a>.Come utilizzare assert_select per verificare la presenza di un determinato collegamento?

Come testare per quello utilizzando assert_select? Voglio verificare la presenza di un tag a con href="/desired_path/1". Come testare gli attributi di un tag?

Esistono risorse per spiegare come utilizzare assert_select? Ho letto la documentazione di Guide e API, ma non l'ho capito. Ci sono dei modi migliori raccomandati per farlo?

Sto lavorando su Rails 3 e utilizzo il framework di test integrato.

Grazie.

risposta

13

È possibile passare qualsiasi selettore CSS per assert_select. Quindi, per testare l'attributo di un tag, si utilizza [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

Questo non funziona più in Rails 5, né, credo, in Rails 4. Vedere [la mia risposta] (https://stackoverflow.com/a/48394216/187833) per la sintassi corrente. – jm3

22

In assert_select, è anche possibile utilizzare un punto di domanda per il valore di attributo, e poi seguire con una stringa da abbinare.

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

C'è un altro modo per utilizzare assert_select che è più cordiale, soprattutto se si desidera far corrispondere un parziale di stringa o regexp modello:

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

+4

Il secondo modulo sembra funzionare solo per il testo di un elemento e non per gli attributi. Ha ignorato la condizione href quando l'ho provato. – Shadwell

+0

Sì, questo funziona, tuttavia, non vedo alcun documento su di esso (tranne un esempio e una menzione di passaggio). – gamov

+6

Come indicato da @Shadwell, il ** modulo ** ** non funziona (Rails 3.2.15). Sfortunatamente, non fa fallire l'assert, credo che l'opzione: href sia ignorata silenziosamente. Se qualcuno vuole provarlo da solo, scrivi qualcosa che dovrebbe fallire nell'argomento href delle espressioni regolari e vedere come continua ad assert_select. –

15

Ecco come si può affermare una serie di cose su un collegamento usando assert_select. Il secondo argomento può essere sia una stringa o di un'espressione regolare per testare l'attributo href contro:

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

Per gli altri modi in cui è possibile utilizzare assert_select, qui sono gli esempi tratti dalla actionpack Rails 3.2.15 docs (vedi file 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

Come testare per più attributi? Mi piace 'a [href =? Dati-foo = "bar"]] '? – Mohamad

+1

@Mohamad, penso che lo farà, in cui ogni attributo è racchiuso tra parentesi quadre: 'assert_select 'a [href =?] [Data-foo =" bar "]', 'http: // test. host/dashboard'' –

2

Per chiunque utilizzi assert_select proveniente da Rails 4.1 e l'aggiornamento a Rails 4.2.

In 4.1 questo ha funzionato:

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

In 4.2 questo ha dato un errore: "disapprovazione ATTENZIONE: L'asserzione non è stato eseguito a causa di un selettore CSS valido inaspettato '(' dopo '[:. Uguale" \ "/ my_results \" "] '"

ho cambiato la sintassi per questo e ha funzionato !:

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

Eliot risposta di cui sopra mi ha aiutato, grazie :)

+0

Hai cercato una risposta a questo problema ovunque. Grazie per aver postato questo! – Kelly

+0

Grazie. In 4.2 il 2 ° parametro 'my_url' deve essere una stringa. Quindi, se stai verificando un intero, ricorda di usare 'to_s'. Ad esempio "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

La domanda chiede specificamente, “Come fai a testare gli attributi di [un elemento]?”

Le altre risposte qui usano assert_select in modi che non funzionano più in corrente Rails/MINITEST.Secondo questo issue, affermazioni circa il contenuto degli attributi ora utilizzare questo più Xpath-y 'match' sintassi:

assert_select "a:match('href', ?)", /jm3\.net/ 
Problemi correlati