Apprezzo molto il comportamento di mocking di Moq Loose
che restituisce valori predefiniti quando non sono impostate aspettative. È comodo e mi salva il codice, e agisce anche come misura di sicurezza: le dipendenze non verranno chiamate involontariamente durante il test dell'unità (purché siano virtuali).Quando si deride una classe con Moq, come posso chiamare CallBase solo per metodi specifici?
Tuttavia, sono confuso su come mantenere questi vantaggi quando il metodo in prova risulta virtuale.
In questo caso, io do voglio chiamare il codice reale per quell'unico metodo, pur avendo il resto della classe vagamente deriso.
Tutto quello che ho trovato nella mia ricerca è che potrei impostare mock.CallBase = true
per garantire che il metodo venga chiamato. Tuttavia, ciò riguarda l'intera classe. Io non voglio farlo perché mi mette in un dilemma di tutte le altre proprietà e metodi nella classe che nascondono le dipendenze di chiamata: se CallBase è vero allora che ho a uno
- stub di installazione per tutti le proprietà e i metodi che nascondono le dipendenze - Anche se il mio test non ritiene necessario preoccuparsi di tali dipendenze, o
- Spero che non dimentichi di installare alcuno stub (e che nessuna nuova dipendenza venga aggiunta al codice in futuro) - I test delle unità di rischio colpiscono una vera dipendenza.
Quello che penso quello che voglio è qualcosa di simile:
mock.Setup(m => m.VirtualMethod()).CallBase();
in modo che quando chiamo mock.Object.VirtualMethod()
, Moq chiama in dell'effettiva esecuzione ...
D: Con Moq, c'è qualche modo testare un metodo virtuale, quando ho deriso la classe per bloccare solo alcune dipendenze? Cioè Senza ricorrere a CallBase = true e dover interrompere tutte le dipendenze?
codice di esempio per illustrare
(utilizza MSTest, InternalsVisibleTo DynamicProxyGenAssembly2)
Nel seguente esempio, TestNonVirtualMethod
passaggi, ma TestVirtualMethod
fallisce - restituisce null.
public class Foo
{
public string NonVirtualMethod() { return GetDependencyA(); }
public virtual string VirtualMethod() { return GetDependencyA();}
internal virtual string GetDependencyA() { return "! Hit REAL Dependency A !"; }
// [... Possibly many other dependencies ...]
internal virtual string GetDependencyN() { return "! Hit REAL Dependency N !"; }
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestNonVirtualMethod()
{
var mockFoo = new Mock<Foo>();
mockFoo.Setup(m => m.GetDependencyA()).Returns(expectedResultString);
string result = mockFoo.Object.NonVirtualMethod();
Assert.AreEqual(expectedResultString, result);
}
[TestMethod]
public void TestVirtualMethod() // Fails
{
var mockFoo = new Mock<Foo>();
mockFoo.Setup(m => m.GetDependencyA()).Returns(expectedResultString);
// (I don't want to setup GetDependencyB ... GetDependencyN here)
string result = mockFoo.Object.VirtualMethod();
Assert.AreEqual(expectedResultString, result);
}
string expectedResultString = "Hit mock dependency A - OK";
}
Basta una breve di ciò che il vostro/la mia esigenza è tutto: Hai bisogno di una versione 'CallBase' quando beffardo che invece di * * "Richiama l'implementazione della classe base se nessuna aspettativa sovrascrive il membro" **, i cosiddetti _Parial Mocks_, per favore chiama l'implementazione di base dei membri derisi! Vorrei nominare la nuova funzione come "CallBaseOnMockedMemberOnly': D –