Abbiamo un caso di test unitario in cui vogliamo affermare che dopo un'operazione login , SUT è in grado di chiamare un metodo su una delle sue dipendenze. Questa dipendenza è una NavigationManager
e l'aspettativa è che chiami NavigationManager.NavigateTo(string)
.
Fino a questo punto, stiamo prendendo in giro il NavigationManager
per isolare SUT . Questo è il nostro metodo di prova:
var calledNavigatedToMethod = false;
nmMock.Setup(nm => nm.NavigateTo(NavigableScreens.MyNextScreen)).Callback(() => calledNavigatedToMethod = true);
SUT.Login();
Assert.IsTrue(calledNavigatedToMethod);
Come puoi vedere, NavigableScreens.MyNextScreen
è una costante, che ci fa pensare che questa non sia una dipendenza , quindi non dovrebbe essere iniettata / derisa. Stiamo semplicemente testando che quando viene chiamato SUT.Login () , la sua dipendenza chiama un metodo con detta costante.
La nostra confusione è che, nel momento in cui stavamo scrivendo il test unitario, NavigableScreens.MyNextScreen
non era ancora definito, il che ha reso il test affidabile sulla sua esistenza, e ci ha fatto pensare che per questo motivo dovrebbe essere iniettato / deriso .
Un argomento proposto è che poiché è una dipendenza del SUT , DEVE esistere , il che significa che l'utilizzo di questa costante nel Test Case è perfettamente soddisfacente, poiché è esattamente la stessa cosa che chiama NavigationManager.NavigateToMyNextScreen()
nel modo in cui se il metodo non esiste al momento della scrittura del test, avremmo lo stesso problema, quindi DEVE esistere.
La domanda sarebbe: l'uso di questa costante nel test case è sbagliato, rendendolo un test non unitario?