Utilizzando Moq per determinare se viene chiamato un metodo

Sono a conoscenza del fatto che posso verificare che una chiamata al metodo si verificherà se chiamo un metodo di livello superiore, ovvero:

public abstract class SomeClass() { public void SomeMehod() { SomeOtherMethod(); } internal abstract void SomeOtherMethod(); } 

Voglio provare che se chiamo SomeMethod() mi aspetto che venga chiamato SomeOtherMethod() .

Ho ragione nel pensare che questo tipo di test sia disponibile in un quadro di derisione?

Puoi vedere se un metodo in qualcosa che hai deriso è stato chiamato usando Verify, ad esempio:

 static void Main(string[] args) { Mock mock = new Mock(); ClassBeingTested testedClass = new ClassBeingTested(); testedClass.WorkMethod(mock.Object); mock.Verify(m => m.MethodToCheckIfCalled()); } class ClassBeingTested { public void WorkMethod(ITest test) { //test.MethodToCheckIfCalled(); } } public interface ITest { void MethodToCheckIfCalled(); } 

Se la linea viene lasciata commentata, verrà lanciata una MockException quando chiami Verify. Se non è commentato, passerà.

No, il test di simulazione presuppone che si stiano utilizzando alcuni schemi di progettazione verificabili, uno dei quali è l’iniezione. Nel tuo caso dovresti provare SomeClass.SomeMethod e SomeOtherMethod devono essere implementati in un’altra quadro che deve essere interfacciata.

Il Someclass costruttore di Someclass sarà come New(ISomeOtherClass) . Quindi si dovrebbe prendere in giro ISomeOtherClass e impostare le aspettative sul suo SomeOtherMethod per essere chiamato e verificare le aspettative.