Gestire la logica di verifica condizionale usando l'asserzione di guardia

3

Ho un test parametrizzato con 2 varianti:

  • NULL valore

e

  • qualsiasi valore NOT NULL

Da questo valore dipende un assert:

  • Nel caso in cui NULL dovrebbe essere controllato se l'oggetto ha field1 con value1
  • Nel caso in cui NOT NULL dovrebbe essere controllato se l'oggetto ha field2 con value2

Come ho detto (vedi xUnit Tests Patterns ) usando le dichiarazioni condizionali in assert è anti-pattern.

Come posso risolvere questo problema correttamente?

In questo momento sto provando ad applicare il modello di asserzione di Guardia:

  • if -assertion è diviso in 2 asserzioni
  • All'inizio c'è il controllo dei parametri di test ( NULL / NOT NULL ) con guardia assertion :

    it('case describing conditionalParamter=NOT NULL'):
        expect(conditionalParamter, 'to be a', 'string') // Guard assertion which can FAIL test. Is it OK? Can I simply **SKIP** assertion WITHOUT test failing 
        expect(myStub.args, 'to satisfy', [[ nonConditionalParamter,  ExpressionWhichUsesNonNullConditionalParamterValue ]])
    
    it('case describing conditionalParamter= NULL')
        expect(conditionalParamter, 'to be falsy') // Guard assertion. The same issue
        expect(myStub.args, 'to satisfy', [[ nonConditionalParamter,  ExpressionForNullConditionalParamterValue ]])
    

Ma in questo caso abbiamo 2 asserzioni fallite. È la soluzione appropriata?

Esistono modi migliori per risolvere il problema?

    
posta hellboy 08.03.2016 - 10:53
fonte

1 risposta

2

Non sei sicuro del framework di test che stai utilizzando. Ma, questo è come potrebbe apparire in RSpec (Ruby):

Metodo sotto test:

class Foo
  def bar(required_param, conditional_param = nil)
    return 'abc' if conditional_param.nil?
    '123'
  end
end

Test:

describe Foo do
  subject(:foo) { described_class.new }

  describe '#bar' do
    subject(:bar) { foo.bar(required_param, conditional_param) }

    let(:required_param) { 'required_param' }

    context 'when conditional_param is nil (not present)' do
      let(:conditional_param) { nil }

      it 'returns abc' do
        expect(bar).to eq('abc')
      end
    end

    context 'when conditional_param is not nil' do
      let(:conditional_param) { true }

      it 'returns 123' do
        expect(bar).to eq('123')
      end
    end
  end
end    
    
risposta data 14.12.2018 - 09:46
fonte

Leggi altre domande sui tag