2010-12-20 4 views
0

Ich benutze Moq (die ich auch sehr neu sowie TDD-Periode bin). Und ich wollte Moq eine Instanz meines Winforms-Hauptformulars erstellen, damit ich dort ein paar Methoden testen konnte. Ist das möglich? Sein Konstruktor nimmt ein Objekt von Assembly().Wie kann ich eine Instanz meines Winform-Hauptformulars erstellen, um einige Methoden zu testen?

Ich habe versucht, die folgenden Versuche erfolglos:

var mockMainForm = new Mock<MainForm>(); 
mockMainForm.Setup(x => x.Assembler).Returns(new Assembly()); 
return mockMainForm.Object; 

Aber ich auf dieses Objekt keine Eigenschaften oder Methoden nicht zugreifen können, sobald sie zurückgegeben. Ist das möglich?

Aber ich bekomme Fehler, die (fehlgeschlagen: System.ArgumentException: Expression kein Methodenaufruf ist: x => x.Assembler bei Moq.ExpressionExtensions.ToMethodCall (Lambda Ausdruck))

Antwort

2

Mocking mit Moq wird nur die Schnittstellen und virtuellen Methoden einer Klasse verhöhnen. Assembler Eigenschaft muss als virtual definiert werden.

In jedem Fall ist es keine gute Idee, eine Windows Form zu verspotten - es hat eine große Tasche mit WIN32 Zeug, die Ihre Tests brüchig macht. Erstellen Sie eine Schnittstelle, die von Ihrem Formular implementiert werden muss, und spotten Sie für Objekte, die mit Ihrem Formular interagieren müssen, wenn Sie Unit Test und ein Formular mocksen müssen.

public interface IHasAssembler 
{ 
    Foo Assembler {get; set;} 
} 

public class MyForm : IHasAssembler 
{ 
    // 
} 

dann die Schnittstelle spotten und nicht die Form:

Mock<IHasAssembler> myMock = new Mock<IHasAssembler>(); 
0

habe ich noch nie verwendet (oder in der Tat gehörte) Moq, aber ich werde erraten, dass mockMainForm.Object vom Typ Form, und dass Sie werfen können, um es zu bekommen: wissen

object moqObject = MakeMoqOfMyMainForm(); 
Form mainForm = (Form)moqObject; 

(Wenn ich falsch ist, lassen Sie mich und ich werde diese Antwort löschen)

+0

Neu-Programmierung und mit Moq und TDD, ich kann nicht sagen, dass Ihre Antwort technisch falsch ist oder nicht, aber es funktioniert nicht Hilf mir, Moq zu benutzen, um meinen Versuch zu machen, Moq zu benutzen, um das Hauptformular zu verspotten. – pghtech

+0

Nun, deine Frage war anders, als ich meine Antwort gepostet habe. Sie wollten auf die Methoden usw. in Ihrem Formular zugreifen, also half ich Ihnen, das Formularobjekt zu erhalten. Das heißt, ich weiß nicht wirklich, ob das die '.Object' -Eigenschaft enthält, da ich Moq vorher noch nie benutzt habe. –

Verwandte Themen