Utilizzando AutoFixture con il pacchetto AutoFixture.AutoMoq, a volte mi trovo prove che non sono stati configurati per testare correttamente la cosa intendevano mettere alla prova, ma il problema non è mai stato scoperto a causa del default (allentato) comportamento Mock:Come posso rendere AutoMoqCustomization utilizzare Strict MockBehavior?
public interface IService
{
bool IsSomethingTrue(int id);
}
void Main()
{
var fixture = new Fixture()
.Customize(new AutoMoqCustomization());
var service = fixture.Freeze<Mock<IService>>();
Console.WriteLine(service.Object.IsSomethingTrue(1)); // false
}
Mi piacerebbe creare Mock creati con un comportamento rigoroso, quindi siamo costretti a chiamare Setup()
per i metodi che ci aspettiamo di essere chiamati. Posso fare questo per ogni singolo finto in questo modo:
fixture.Customize<Mock<IService>>(c => c.FromFactory(() => new Mock<IService>(MockBehavior.Strict)));
Ma dopo la pettinatura attraverso il codice sorgente per AutoMoqCustomization() e le varie ISpecimenBuilder
e altre implementazioni, sono abbastanza perso per quanto riguarda il modo migliore per fare proprio tutto I mazzi vengono inizializzati con un comportamento rigoroso. Il framework sembra essere molto flessibile ed estensibile, quindi sono sicuro che c'è un modo semplice per farlo: non riesco a capire come.
Grazie per il feedback. Vedrò se riesco a farlo funzionare. Riguardo alle stronzate severe: se i burloni fossero veramente "schifosi", penso che il tuo punto sia valido. Sfortunatamente, la maggior parte dei miei mock in realtà servono allo scopo di * stub *, che dovrebbero restituire un valore. Se il SUT si basa sui dati restituiti dallo stub e non ho impostato lo stub, nel migliore dei casi il test fallirà e nel peggiore dei casi il test passerà per il motivo sbagliato. Preferirei, in entrambi i casi, vedere immediatamente la riga di codice che mostra quale stub deve essere configurato, piuttosto che dover dedurre da dove viene la NRE. – StriplingWarrior
@StriplingWarrior http://blog.ploeh.dk/2013/10/23/mocks-for-commands-stubs-for-queries –
Trovo che l'esempio dell'articolo sia piuttosto elaborato: rompere CQS per creare e restituire un oggetto utente che non ha nemmeno l'ID fornito per il metodo GetUser.Questi non sono i tipi di modifiche che in genere vedo essere apportate ai metodi. Le modifiche che vedo regolarmente richiederebbero comunque un cambio nel test unitario, anche se sono state scritte come l'ultimo esempio corretto in quell'articolo. Quando ciò accade, trovo che il comportamento fail-fast di Strict mock fa risparmiare un sacco di tempo e, cosa più importante, aiuta a garantire che i miei test unitari stiano testando ciò che affermano di testare. – StriplingWarrior