Setup come così:Ripristina la verifica fittizia in Moq?
public interface IFoo
{
void Fizz();
}
[Test]
public void A()
{
var foo = new Mock<IFoo>(MockBehavior.Loose);
foo.Object.Fizz();
foo.Verify(x => x.Fizz());
// stuff here
foo.Verify(x => x.Fizz(), Times.Never()); // currently this fails
}
Fondamentalmente vorrei inserire un codice a // stuff here
per far passare foo.Verify(x => x.Fizz(), Times.Never())
.
E perché questo costituisce probabilmente moq/unità di abuso di test, la mia giustificazione è così che io possa fare qualcosa di simile:
[Test]
public void Justification()
{
var foo = new Mock<IFoo>(MockBehavior.Loose);
foo.Setup(x => x.Fizz());
var objectUnderTest = new ObjectUnderTest(foo.Object);
objectUnderTest.DoStuffToPushIntoState1(); // this is various lines of code and setup
foo.Verify(x => x.Fizz());
// reset the verification here
objectUnderTest.DoStuffToPushIntoState2(); // more lines of code
foo.Verify(x => x.Fizz(), Times.Never());
}
Fondamentalmente, ho un oggetto stato in cui un bel po 'di lavoro (sia in termini di fare vari oggetti finti e altri fafing in giro) è necessario per spingerlo in stato1. Quindi voglio testare la transizione da State1 a State2. Invece di duplicare o astrarre il codice, preferirei semplicemente riutilizzare il test State1, inserirlo in State2 ed eseguire i miei Assert - tutto ciò che posso fare tranne le chiamate di verifica.
Hai provato questo? Becauese per me il secondo 'foo.Verify (x => x.Fizz(), Times.Once());' restituisce sempre true - anche se non si chiama 'objectUnderTest.DoStuffToPushIntoState2();' – fostandy
@fostandy, se chiami 'DoStuffToPushIntoState1()', e ciò chiama 'Fizz' una volta, quindi passerà' Times.Once() '. Se commentate 'DoStuffToPushIntoState2()' e nient'altro chiama 'Fizz',' Times.Once() 'continuerà a passare. Modificherò la mia risposta per aggiungere codice che ho testato. –
Grazie alla deriva - ho frainteso te e tu hai ragione. – fostandy