2014-04-09 10 views
5

Sto testando un controller MVC che si basa su un valore restituito da una proprietà di sola lettura sulla classe base.Sostituisci solo la proprietà read in oggetto parzialmente beffato

Il getter per questa proprietà genera un'eccezione quando viene chiamato poiché si basa su uno HttpContext (e altre cose brutte) che preferirei evitare di deridere.

Questo è quello che ho provato finora:

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

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

Eppure questo genera un'eccezione, non appena si accede UserInfo.

proprietà su base di classe è:

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

Ho provato impostando la proprietà classe base al virtuale, ma poi ho un'un'eccezione procura Castello.

+0

Puoi aggiungere una dipendenza a 'MyController' che accede a' UserInfo' e cose correlate? Al momento del test passare in un 'FakeUserInfoProvider' e in fase di esecuzione utilizzare un' HttpContextUserInfoProvider'? –

risposta

4

Penso che potresti avere un altro problema. NSubstitute è in grado di gestire la sostituzione delle proprietà virtuali. Ecco un piccolo programma che illustra

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: Per quanto riguarda l'utilizzo del ForPartsOf Non credo sia possibile sostituire una proprietà in questo modo, dal momento che non v'è alcun modo di informare NSubstitute che don' Voglio che chiami il codice base. Ecco perché la documentazione menziona quel sub parziale sono not recommended

È possibile modificare la classe base per restituire il valore di una funzione virtuale; questa funzione virtuale sarebbe quindi sostituita. Nessuna modifica della firma per i chiamanti. Anche se questo è un hack otterresti quello che ti serve

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

E il parziale simulato 'ForPartsOf'? –

+0

@ Benfoster In effetti, non avevo visto il metodo ForPartsOf, che in questo caso non funziona. Esaminandoli – samy

+0

@BenFoster ha modificato la mia risposta per aggiungere alcune informazioni su 'ForPartsOf' – samy

Problemi correlati