2011-09-29 4 views
5

Sto scrivendo un test controller per un'applicazione rails 3.1 utilizzando l'unità di prova 2.4.0.ArgumentError: il messaggio di asserzione deve essere String o Proc utilizzando assert_select

Voglio affermare che una determinata intestazione non appare sulla pagina.

sto usando assert_select come questo:

assert_select 'h1', {:text => /Key Dates/, :count => 0} 

e ottenere il seguente errore:

ArgumentError: assertion message must be String or Proc: <</Key Dates/> 
expected but was <"Planner Maternity leave">.>(<Test::Unit::Assertions::AssertionMessage>) 

ho rintracciato questo giù al fatto che assert_select chiamate build_message che crea un'istanza di AssertionMessage e passa attraverso allo assert dell'unità di prova. Tuttavia nella versione 2.2 di testunit (febbraio 2011) sono stati aggiunti controlli che controllano il tipo di messaggio inoltrato. Questi controlli attivano lo ArgumentError visto sopra.

Non sono sicuro che l'errore sia dovuto al fatto che l'unità di test è troppo rigida o assert_select che passa il tipo di oggetto sbagliato.

Potete consigliarvi il modo migliore per seguire questo? Qualche soluzione?

+0

è il problema che il valore in ': text' dovrebbe essere una stringa, e non un pattern? – jefflunt

+0

Ciao, no, è abbastanza accettabile per: il testo deve essere un Regexp – heathd

risposta

0

Così, il assert_select documentation mostra il seguente esempio, il superamento di un blocco:

assert_select "ol" do |elements| 
    elements.each do |element| 
    assert_select element, "li", 4 
    end 
end 

Che importa se hai fatto qualcosa di simile ...

assert_select 'h1' do |elements| 
    elements.length == 0 ? fail 
    elements.each do |element| 
    element.text ~= /Key Dates/ ? fail 
    end 
end 

che non riesce in fondo se si trova il modello O se il numero di elementi h1 è zero. Ovviamente cambieresti le condizioni per abbinare ciò che stai cercando di testare, ma ti avvicini di più a ciò di cui hai bisogno?

0

Se non è possibile eseguire l'aggiornamento ad una versione privo di bug, si può semplicemente passare un terzo argomento (il messaggio), in modo da non forzare il messaggio da costruire:

assert_select 'h1', {:text => /Key Dates/, :count => 0}, "Unexpected Key Dates found."