Come allegare un messaggio al controllo rspec?
Domanda
In rspec: Posso allegare un messaggio a un assegno allo stesso modo come avrei fatto a xUnit framework di test stile? Come?
assert_equal value1, value2, "something is wrong"
Soluzione
should
e should_not
prendere un secondo argomento (message
) che sostituisce il messaggio predefinito del matcher.
1.should be(2), 'one is not two!'
I messaggi predefiniti sono di solito molto utile però.
Aggiornamento:
per RSpec 3:
expect(1).to eq(2), "one is not two!"
Altri suggerimenti
In RSpec, è compito del matcher per stampare un messaggio di errore ragionevole. Le matchers generici forniti con RSpec può ovviamente stampare solo i messaggi di errore generici senza particolari caratteristiche, dal momento che non sanno nulla di vostro particolare dominio. Ecco perché si raccomanda di scrivere il proprio matchers dominio-specifici, che vi darà entrambi i test più leggibile e messaggi di errore più leggibile.
Ecco un esempio dalla documentazione RSpec :
require 'rspec/expectations'
RSpec::Matchers.define :be_a_multiple_of do |expected|
match do |actual|
(actual % expected).zero?
end
failure_message_for_should do |actual|
"expected that #{actual} would be a multiple of #{expected}"
end
failure_message_for_should_not do |actual|
"expected that #{actual} would not be a multiple of #{expected}"
end
description do
"be multiple of #{expected}"
end
end
Nota: è necessario solo match
, gli altri verrà generato automaticamente. Tuttavia, il punto della tua domanda è, naturalmente, che si fa non come i messaggi predefiniti, quindi è necessario almeno definire failure_message_for_should
.
Inoltre, è possibile definire match_for_should
e match_for_should_not
invece di match
se avete bisogno di logica diversa nel caso positivo e negativo.
Come dimostra @ Chris Johnsen, si può anche passare in modo esplicito un messaggio alle aspettative. Tuttavia, si corre il rischio di perdere i vantaggi di leggibilità.
Confrontare questo:
user.permissions.should be(42), 'user does not have administrative rights'
con questo:
user.should have_administrative_rights
Questo sarebbe (più o meno) essere implementato in questo modo:
require 'rspec/expectations'
RSpec::Matchers.define :have_administrative_rights do
match do |thing|
thing.permissions == 42
end
failure_message_for_should do |actual|
'user does not have administrative rights'
end
failure_message_for_should_not do |actual|
'user has administrative rights'
end
end
Nel mio caso si trattava di un problema di parentesi:
expect(coder.is_partial?(v)).to eq p, "expected #{v} for #{p}"
questo ha determinato un numero errato di argomenti, mentre il modo corretto è:
expect(coder.is_partial?(v)).to eq(p), "expected #{v} for #{p}"