2011-10-03 18 views
7

Con NSubstitute, esiste un modo per acquisire il valore che si passa a un setter di proprietà?NSubstitute intercettazione "setter" solo invocazione proprietà

E.g. se ho la seguente interfaccia:

public interface IStudent { 
    int Id { set; } 
    string Name { set; } 
} 

Il dire che ho un sostituto per esempio creato:

var _studentSub = Substitute.For<IStudent>(); 

C'è un modo per intercettare e catturare il valore se uno qualsiasi dei "set" metodi di il sostituto è invocato?

risposta

13

L'approccio standard per NSubstitute è quello di avere proprietà con getter e setter, in quanto le proprietà sui sostituti funzioneranno come previsto (ad esempio si ripristinerà ciò che è impostato).

Se l'interfaccia deve avere proprietà setter solo è possibile catturare il valore di una singola proprietà utilizzando Arg.Do:

[Test] 
public void Setter() { 
    var sub = Substitute.For<IStudent>(); 
    var name = ""; 
    sub.Name = Arg.Do<string>(x => name = x); 

    sub.Name = "Jane"; 

    Assert.AreEqual("Jane", name); 
} 
+0

Per una proprietà con get/set, puoi utilizzare sub.Name = Arg.Do (x => nome = x); per acquisire un valore e utilizzare ancora sub.Name.Returns ("MySampleName"); per restituire valori? I "ritorni" non sembrano funzionare per noi! – bstack

+1

Appena controllato, sembra un bug che combina Arg.Do e Returns per la stessa proprietà get/set. Funziona se si passa Arg.Do per When..Do. per esempio. "sub.When (x => x.Name = Arg.Any ()). Do (x => nome = x.Arg ());" –

+1

Vedere [segnalazione bug] (https://github.com/nsubstitute/NSubstitute/issues/59) per il funzionamento di When..Do example. –

Problemi correlati