Sto cercando di capire questa ginnastica Moq per le ultime ore. Ho le seguenti classi - e sto provando a fare una verifica un po 'semplice e sta fallendo - e non riesco a capire perché.Verifica moq nidificata
Avviso durante l'installazione di Moq, restituisco un Mock.Of quando viene richiesto BeginCounter - ma quando provo a verificarlo fallisce. Tuttavia, se disapprovo la riga p.Setup (e => e.BeginCounter.Increment()) la verifica funziona.
Cosa mi manca?
public interface IPerformanceCounters
{
void Increment();
void Decrement();
}
public interface IContext
{
IPerformanceCounters BeginCounter { get; }
}
public class Test
{
private readonly IContext context;
public Test(IContext context) { this.context = context; }
public void React() { this.context.BeginCounter.Increment(); }
}
void Test()
{
// ARRANGE
var p = new Mock<IContext>();
p.Setup(e => e.BeginCounter).Returns(() => Mock.Of<IPerformanceCounters>()); // This does not work
// p.Setup(e => e.BeginCounter.Increment()); // However, this works!
// ACT
var test = new Test(p.Object);
test.React();
// ASSERT
p.Verify(v => v.BeginCounter.Increment(), Times.Once());
}
Non penso che questa affermazione "metodo non di installazione non verificabile" sia vera. Ecco perché. Se aggiungo un metodo in IContext, posso verificarlo senza una configurazione. È la natura annidata di IContext> IPerformanceCounters che sta causando un problema che non riesco a capire. – splusq
Ho appena aggiornato la mia risposta. Speriamo, questo ha più senso. Nel peggiore dei casi è possibile scavare nel codice in quanto è open source –
grazie - Mock.Get è un bel trucco. – splusq