2008-12-07 13 views
133
genannt wird

Es ist mein Verständnis, dass ich, dass ein Methodenaufruf, wenn ich eine höhere Methode, dh Aufruf auftreten testen kann:Moq verwenden, um zu bestimmen, ob ein Verfahren

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

    internal abstract void SomeOtherMethod(); 
} 

ich testen will, wenn ich Rufen Sie SomeMethod() dann erwarte ich, dass SomeOtherMethod() aufgerufen wird.

Bin ich der Meinung, dass diese Art von Test in einem spöttischen Rahmen verfügbar ist?

Antwort

152

Sie können sehen, ob ein Verfahren, in etwas, das Sie verhöhnt wurde durch die Verwendung Überprüfen Sie, z.B .:

static void Main(string[] args) 
{ 
     Mock<ITest> mock = new Mock<ITest>(); 

     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(); 
} 

Wenn die Linie verlassen wird kommentiert es wird werfen einen MockException, wenn Sie anrufen Überprüfen aufgerufen. Wenn es unkommentiert ist, wird es passieren.

+4

Dies ist die richtige Antwort. Sie müssen jedoch etwas verstehen. Sie können nicht eine Methode/Eigenschaft vortäuschen, die nicht abstrakt oder virtuell ist (offensichtlich können alle Schnittstellenmethoden und -eigenschaften verspottet werden). – Will

+25

-1: Der .Expect (...). Verifizierbar() ist in diesem Code redundant. Mit AAA ist die Bestätigung, die Sie haben, genau richtig. .Verifizierbar ist für die Verwendung mit .Verify() i, .e. die keine arg Version. Siehe http://stackoverflow.com/questions/980554/what-is-the-purpose-of-verifyable-in-moq/1728496#1728496 –

+0

kann dies ohne Konstruktor Injektion getan werden? –

6

Nein, Scheintests gehen davon aus, dass Sie bestimmte testbare Entwurfsmuster verwenden, von denen eines die Injektion ist. In Ihrem Fall würden Sie SomeClass.SomeMethod testen und SomeOtherMethod müssen in einer anderen Entität implementiert werden, die eine Schnittstelle benötigt.

Ihr Someclass Konstruktor würde wie New(ISomeOtherClass) aussehen. Dann würden Sie die ISomeOtherClass überspionieren und die Erwartung auf seine SomeOtherMethod setzen und die Erwartung bestätigen.

+0

Ich denke, dieser Ansatz passt zu der akzeptierten Antwort. – brimble2010