2017-03-28 3 views
0

Geht durch https://github.com/Moq/moq4/wiki/Quickstart, sehe ich es Mock eine Schnittstelle.Kann ich moq Mock <MyClass> verwenden, um eine Klasse zu verspotten, keine Schnittstelle?

Ich habe eine Klasse in meinem Legacy-Code, der nicht über eine Schnittstelle verfügt, wenn ich `Mock‘, erhalte ich die folgende Ausnahme:

Additional information: Can not instantiate proxy of class: MyCompnay.Mylegacy.MyClass. 

Wie kann ich Moq verwenden Klasse von Legacy-Code zu verspotten?

Vielen Dank.

+0

Es gibt wahrscheinlich mehr zu der Fehlermeldung, die erklärt, warum Moq den Proxy nicht erstellen kann. Wenn Sie die Klassendefinition (zumindest die Konstruktoren) zusammen mit dem Testcode, der moq verwendet, einschließen, erhalten Sie wahrscheinlich eine Antwort. – PatrickSteele

+4

Mögliches Duplikat von [Wie man eine Klasse ohne Interface und keine virtuellen Methoden in C# vortäuscht?] (Http://stackoverflow.com/questions/39356771/how-to-mock-a-class-with-no-interface-) und-no-virtual-methods-in-c) –

+0

Zeigen Sie ein Beispiel für die Klasse. es sei denn, die Klasse ist versiegelt oder hat keine virtuellen Methoden oder Eigenschaften, dann sollte es in der Lage sein, verspottet zu werden. – Nkosi

Antwort

3

Es ist möglich konkrete Klassen zu verspotten

[TestClass] 
public class PlaceholderParserFixture 
{ 

    public class Foo 
    { 
    public virtual int GetValue() 
    { 
     return 11; 
    } 
    } 

    public class Bar 
    { 
    private readonly Foo _foo; 

    public Bar(Foo foo) 
    { 
     _foo = foo; 
    } 

    public int GetValue() 
    { 
     return _foo.GetValue(); 
    } 
    } 

    [TestMethod] 
    public void MyTestMethod() 
    { 
    var foo = new Mock<Foo>(); 
    foo.Setup(mk => mk.GetValue()).Returns(16); 
    var bar = new Bar(foo.Object); 

    Assert.AreEqual(16, bar.GetValue()); 
    } 

} 

aber

  • Es muss eine öffentliche Klasse sein
  • Verfahren verspottet werden muss virtuell sein

Die Nachricht s Ich habe für:

der Klasse Intern

Castle.DynamicProxy.Generators.GeneratorException: Typ MoqFixture + Foo nicht öffentlich ist. Proxy für Typen, auf die nicht zugegriffen werden kann, kann nicht erstellt werden.

oder einer nicht-virtuelle Methode mit

System.NotSupportedException: Ungültige-Einrichtung auf einem nicht-virtuell (überschreibbar in VB) Mitglied: mk => mk.GetValue()

stimmen nicht mit Ihrer cannot instantiate Nachricht überein, so scheint etwas anderes falsch zu sein.

Wenn Sie nicht über einen Standard-Konstruktor auf dem verspotteten Objekt haben, können Sie diese Fehlermeldung erhalten

z.B.

public class Foo 
{ 

    private int _value; 
    public Foo(int value) 
    { 
     _value = value; 
    } 

    public virtual int GetValue() 
    { 
     return _value; 
    } 
} 

kann man dies umgehen, indem Werte in die Mock <> Ctor

zum Beispiel vorbei

var foo = new Mock<Foo>(MockBehavior.Strict, new object[] { 11 }); 
Verwandte Themen