Come iniettare il componente verificabile dall'unità nella classe verificabile dall'unità?

1

Ho una classe che trarrebbe grande beneficio dai test di unità, ma pochi metodi che chiamano web server remoto devono essere sostituiti da qualcosa che fornisce risultati simulati. Le soluzioni probabili che vedo sono:

  • Verifica la classe derivata che sovrascrive i metodi problematici (nessun codice relativo al test in produzione, solo i metodi devono essere non privati e non finali).
  • Estrai metodi problematici in componenti separati.

Il secondo caso richiede di aggiungere questo componente in qualche modo durante i test e le esecuzioni di produzione, e potrebbe avere almeno le seguenti soluzioni:

  • Hanno un campo protetto che può essere assegnato direttamente durante l'impostazione del test, sostituendo il componente lì. Rompe un po 'i concetti OOP.
  • Chiedere al setter di impostare il componente. Non è ancora la migliore API in quanto questo componente non può essere sostituito improvvisamente dopo che l'oggetto principale diventa attivo con le sue funzioni. Sarebbe un metodo con la finestra temporale limitata per chiamare.
  • Avere il costruttore che accetta un'implementazione interattiva o una simulazione. Questo rende la API un po 'strana (costruisci sempre e passa lo stesso oggetto).
  • Avere il secondo costruttore per il test che accetta solo una simulazione, chiamate del costruttore di produzione this (..) con l'istanza di produzione precostruita.
  • Avere qualcosa come il servizio di denominazione che risolve il componente (sembra un sacco di lavoro da creare e mantenere, se solo per il supporto di test, modello singleton).
  • Usa framework di dipendenze per l'iniezione (se il progetto è più piccolo, sembra anche un sacco di spese generali).

Quali di queste soluzioni proposte sono "teoricamente corrette"? O forse alcune altre soluzioni sono più corrette?

    
posta h22 06.06.2017 - 11:12
fonte

1 risposta

5

Separa le chiamate remote in un oggetto separato e forniscile tramite il costruttore. Questa è la soluzione più pulita, dal momento che vorrai comunque questa separazione (a causa della separazione delle preoccupazioni), e significa che puoi introdurre un framework di iniezione di dipendenza se ritieni che possa fornire un beneficio, ma non lo fai Se necessario, puoi anche fornire la dipendenza "manualmente" se la trovi più semplice.

Le altre soluzioni che proponi in genere hanno lo svantaggio di aggiungere codice specifico per test direttamente alla logica del dominio.

    
risposta data 06.06.2017 - 13:14
fonte

Leggi altre domande sui tag