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"
È stato utile?

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}"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top