Mock up oggetto di classe

2

Ad esempio ho classe ItemDownloader che ha metodo downloadItem . Questo metodo crea un'istanza di un'altra classe - Download per eseguire il download effettivo.

La domanda è: voglio testare ItemDownloader in isolamento, quindi probabilmente mock up Download . Come dovrei farlo?

P.S .: La domanda è più sulla progettazione che sull'implementazione, posso certamente prendere in giro oggetti di classe in linguaggi come Smalltalk o Objective-C, o usare Prototype pattern in C ++. Ma come ho capito, c'è una soluzione migliore.

    
posta goodfella 27.02.2013 - 20:16
fonte

2 risposte

0

Credo che tu stia parlando di Dependency Injection: l'atto di passare una dipendenza a una classe che lo richiede, tramite un costruttore, una proprietà o un parametro di metodo.

Nel tuo caso questo significa non costruire la classe Download direttamente nella classe ItemDownloader, ma passarla nella classe ItemDownloader tramite il parametro costruttore, proprietà o metodo. Dovresti prendere in giro la classe Download e passare la versione derisoria.

Ci sono molte informazioni su DI sul web, qui per esempio.

    
risposta data 27.02.2013 - 20:40
fonte
2

Sono d'accordo con Greg che l'iniezione di dipendenza ti aiuterà a risolvere molti problemi.

Ecco un'idea generale dell'aspetto attuale della tua classe (solo un'ipotesi):

public class ItemDownloader {
    public void Download(){
        var download = new Download();
        download.Start(); // Or whatever is done with the downloader
    }
}

Ora se dovessimo refactoring per prendere il download come dipendenza (ho anche usato il pattern factory qui come presumo che non stai riutilizzando il tuo singolo oggetto download ogni volta che viene chiamato il metodo Download) diventa molto più facile da testare senza preoccuparsi dell'implementazione della vera classe di download.

public class ItemDownloader {
    private DownloadFactory _downloadFactory { get; private set; }

    public ItemDownloader(DownloadFactory downloadFactory) {
        _downloadFactory = downloadFactory;
    }

    public void Download(){
        var download = _downloadFactory.CreateDownload();
        download.Start();
    }
}

public class ItemDownloaderTests {
    public class TestWithMockDownloadFactory(){
        var fake = new Mock<DownloadFactory>();
        /// Logic to setup the fake as needed would go here.
        var systemUnderTest = new ItemDownloader(fake.Object);
    }
}
    
risposta data 27.02.2013 - 21:24
fonte

Leggi altre domande sui tag