2015-01-22 15 views
5

ich eine Klasse „Beispiel“ mit einer Eigenschaft „data“, die einen privaten Setter hat habe, und ich möchte, dass die Daten Eigenschaftwie eine Eigenschaft mit privaten Setter verspotten mit NSubstitute

Public class Example { public string data {get; private set;}} 

verspotten würde ich gerne die Dateneigenschaft mit NSubstitute überspielen. Könnte mir jemand helfen, wie es geht?

+1

Wahrscheinlich nicht möglich - die meisten spöttischen Bibliotheken sind nicht in der Lage, nicht-virtuelle Methoden ohne Schnittstelle zu verspotten. Kurz vor der Neugestaltung Ihrer Klassen benötigen Sie ein viel schwereres Tool, das Code wie [Microsoft Moles] (https://msdn.microsoft.com/en-us/library/ff798308.aspx) neu schreiben kann. –

+0

Es kann erwähnenswert sein, ob Sie die Klasse 'Example' bearbeiten können. Wie von @AlexeiLevenkov bemerkt, wenn Sie nicht können dann NSub kann Ihnen nicht helfen. Wenn Sie können, @ JohnKoerner Antwort zeigt einen Weg, es zu tun. –

Antwort

11

NSubstitute kann nur abstract oder virtual Methoden auf konkrete Klassen vortäuschen. Wenn Sie den zugrunde liegenden Code ändern können, um eine Schnittstelle zu verwenden, können Sie die Schnittstelle mockten:

public class Example : IExample { public string data { get; private set; } } 
public interface IExample { string data { get; } } 

[TestMethod] 
public void One() 
{ 
    var fakeExample = NSubstitute.Substitute.For<IExample>(); 
    fakeExample.data.Returns("FooBar"); 

    Assert.AreEqual("FooBar", fakeExample.data); 
} 
+0

Die virtuelle Datei 'Example.data' würde auch für diesen Test funktionieren, ohne die Schnittstelle hinzuzufügen. (Obwohl ich im Allgemeinen Schnittstellen für dynamisches proxy-basiertes Mocking bevorzuge.) –

+0

Klingt richtig, aber ich konnte substitute.Received (1) .Method() verwenden, wobei Methode nicht abstrakt oder virtuell ist. –