2014-04-09 7 views
5

Ich teste einen MVC-Controller, der auf einem Wert beruht, der von einer schreibgeschützten Eigenschaft der Basisklasse zurückgegeben wird.Ersetze schreibgeschützte Eigenschaft in teilweise verspottetem Objekt

Der Getter für diese Eigenschaft löst eine Ausnahme aus, wenn es aufgerufen wird, da es sich auf eine HttpContext (und andere böse Sachen) verlässt, die ich lieber vermeiden würde zu spotten.

Das ist, was ich bisher versucht habe:

controller = Substitute.ForPartsOf<MyController>(
    Substitute.For<SomeDependency>(), 
); 

controller.UserInfo.Returns(new UserInfo()); 

Dennoch wirft diese eine Ausnahme, sobald Userinfo zugegriffen wird.

Eigentum auf Basisklasse:

public UserInfo UserInfo 
{ 
    get 
    { 
     // HttpContext dependent stuff 
    } 
} 

Ich habe versucht, die Basisklasse-Eigenschaft auf virtuelle Umgebung, aber dann bekomme ich eine Proxy-Ausnahme Castle.

+0

Können Sie eine Abhängigkeit zu 'MyController' hinzufügen, die auf' UserInfo' und verwandte Sachen zugreift? Geben Sie zur Testzeit einen 'FakeUserInfoProvider' ein und verwenden Sie zur Laufzeit einen' HttpContextUserInfoProvider'? –

Antwort

4

Ich denke, Sie haben vielleicht ein anderes Problem. NSubstitute ist in der Lage, die Ersetzung von virtuellen Eigenschaften zu handhaben. Hier ist ein kleines Programm, das

public class SubstitutedClass 
{ 
    public virtual int SubstitutedProperty { get { throw new InvalidOperationException(); } } 
} 

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     var test2 = Substitute.For<SubstitutedClass>(); 
     test2.SubstitutedProperty.Returns(10); 
     Console.WriteLine(test2.SubstitutedProperty); 
    } 
} 

EDIT zeigt: In Bezug auf die Nutzung von ForPartsOf Ich glaube nicht, es möglich ist, eine Eigenschaft auf diese Weise außer Kraft zu setzen, da es keine Möglichkeit gibt NSubstitute zu informieren, dass wir don‘ Ich möchte, dass es den Basiscode aufruft. Aus diesem Grund erwähnt die Dokumentation, dass Teiluntereinheit not recommended

Sie können die Basisklasse ändern, um den Wert einer virtuellen Funktion zurückzugeben; Diese virtuelle Funktion würde dann ersetzt werden. Keine Signaturänderung für die Anrufer. Obwohl dies ein Hack ist, würden Sie bekommen, was Sie brauchen

public class SubstitutedClass 
{ 
    public virtual int SubstitutedProperty { get { return InnerValue(); } } 
    public virtual int InnerValue() { throw new InvalidOperationException(); } 
} 

var test2 = Substitute.ForPartsOf<SubstitutedClass>(); 
test2.When(t => t.InnerValue()).DoNotCallBase(); 
test2.InnerValue().Returns(10); 
+0

Was ist mit dem partiellen Schein "ForPartsOf"? –

+0

@BenFoster Tatsächlich hatte ich die ForPartsOf Methode nicht gesehen, die in diesem Fall nicht funktioniert. Ein Blick darauf – samy

+0

@BenFoster meine Antwort bearbeitet, um einige Informationen in Bezug auf 'ForPartsOf' hinzuzufügen – samy

Verwandte Themen