2014-10-13 7 views
8

Il mio progetto ha questo valore impostato nel file rspec_helper.rbIn RSpec possiamo spegnere verify_partial_doubles per un test

mocks.verify_partial_doubles = true 

Ho un test che viene sempre contrassegnato

TaskPublisher does not implement #publish 

Il problema è che il metodo non esiste sull'oggetto finché non viene istanziato. È un modulo di importazione basato sul tipo di attività da pubblicare. (meta programmazione)

Quindi mi chiedo se c'è un modo per disattivare verify_partial_doubles per un test specifico, ma non influire sugli altri test che hanno il valore.

Domanda laterale: non avendo questo flag impostato su true non è possibile eseguire BDD? Mi sembra che risponda a Mocking come è definito (https://stackoverflow.com/tags/mocking/info).

risposta

6

[Esiste] un modo per disattivare [verify_partial_doubles] per un test specifico ..?

RSpec> = 3,6

Uso without_partial_double_verification

it 'example' do 
    without_partial_double_verification do 
    # ... 
    end 
end 

http://rspec.info/blog/2017/05/rspec-3-6-has-been-released/

RSpec < 3,6

Y es, con user-defined metadata e un global "around hook":

# In your spec .. 
describe "foo", verify_stubs: false do 
    # ... 
end 

# In spec_helper.rb 
RSpec.configure do |config| 
    config.mock_with :rspec do |mocks| 
    mocks.verify_partial_doubles = true 
    end 

    config.around(:each, verify_stubs: false) do |ex| 
    config.mock_with :rspec do |mocks| 
     mocks.verify_partial_doubles = false 
     ex.run 
     mocks.verify_partial_doubles = true 
    end 
    end 
end 

credo di credito per questa tecnica va a Nicholas Rutherford, dal suo incarico nel rspec-rails issue #1076.

0

Abbiamo riscontrato un problema simile di recente, e finito per andare con questo:

config.mock_with :rspec do |mocks| 
    mocks.verify_partial_doubles = true 

    config.around(:example, :without_verify_partial_doubles) do |example| 
    mocks.verify_partial_doubles = false 
    example.call 
    mocks.verify_partial_doubles = true 
    end 
end 

Molto simile alla risposta di Jared Beck, ma evitando una seconda chiamata a mock_with.