Test dell'unità con dipendenze multiple

-3

Sulla base di questo Q: link capisco (ed è ovvio in retrospettiva) cosa ho sto sbagliando Comunque dato lo scenario come unità testando quanto segue:

Method 1(dependency1, dependency2)

Come posso verificare che la dipendenza 2 sia chiamata in base a una condizione di dipendenza1 e, immagino, devo fare ancora meglio?

Modifica: per spiegare perché questo non è un duplicato di (Perché) è importante che un test unitario non provi le dipendenze? Sto chiedendo essenzialmente un metodo che ottiene i dati da un servizio cache a meno che non sia vuoto, nel qual caso chiama un altro servizio (entrambi passati come dipendenze) dovrei verificare che il secondo servizio sia chiamato data una cache nulla. Il q originale link contiene ulteriori dettagli

    
posta Scrambledheads 21.06.2018 - 17:51
fonte

1 risposta

1

Supponendo che tu stia stoppiando e non prendendo in giro, lo faresti in questo modo:

interface ICache
{
    string Data{ get; set; }
}

interface IDataSource
{
    string GetData { get; }
}

class CacheStub : ICache
{
    public string Data { get; set; }
}

class DataSourceStub : IDataSource
{
    public bool Called { get; set; } = false;
    public string GetData { get { Called = true; return "sdkjhr"; } }
}

void TestCacheMiss()
{
    //Arrange
    var o = new ClassUnderTest();
    var cache = new CacheStub { Data = null };
    var data = new DataSourceStub();

    //Act
    o.Method(cache, data);

    //Assert
    Assert.IsTrue(data.Called);
}

void TestCacheHit()
{
    //Arrange
    var o = new ClassUnderTest();
    var cache = new CacheStub { Data = "xkjhs" };
    var data = new DataSourceStub();

    //Act
    o.Method(cache, data);

    //Assert
    Assert.IsFalse(data.Called);
}

L'idea qui è che il tuo stub contiene un flag che viene impostato se si verifica un determinato comportamento, indicando quindi se una mancanza della cache ha provocato correttamente nessuna chiamata, o un hit della cache ha provocato una chiamata. Quindi affermiamo sulla bandiera. In questi test non stiamo verificando i dati, quindi inseriamo semplicemente i valori indesiderati per i dati stessi.

Se stavi prendendo in giro, dovresti usare un po 'di sapore di Isolate.Verify.WasCalled() o simile, a seconda del framework.

    
risposta data 23.06.2018 - 05:25
fonte

Leggi altre domande sui tag