2011-01-26 1 views
9

voglio MOQ prossimo oggetto:proprietà Moq con setter protetto

abstract class Foo 
{ 
    public string Bar { get; protected set; } 
} 

in modo che new Mock<Foo>().Bar ritorno "Blah".

Come posso farlo?


fooMock.SetupGet<string>(s => s.Bar).Returns("Blah"); 

tiri

Fallimento: System.NotSupportedException: l'installazione non valido su un membro non virtuale: s => s.Date

e

fooMock.Protected().SetupGet<string>("Bar").Returns("Blah"); 

getta

Per specificare un'impostazione per la proprietà pubblica StatementSection.Date, utilizzare i sovraccarichi digitati

risposta

7

Dal deridevano e viene fatto con la creazione di un proxy della classe, solo funzione virtuale/proprietà può essere "moqued"

+0

Così come agire? Chiama il setter della proprietà usando la riflessione? Modifica proprietà per rendere virtuale? – abatishchev

+0

Penso che l'unica applibile sia la seconda. –

7

Come Felice (+1) ha detto che il mocking crea un proxy che significa che devi rendere le cose virtuali (in modo che Moq possa sfruttare la sua magia di proxy e scavalcare la proprietà).

In alternativa, se si desidera solo per schizzare in un valore che si può stub manualmente la classe che si vuole testare ed esporre un mezzo per arrivare al setter: -

public class FooStub : Foo { 
    public SetBar(string newValue) { 
     Bar = newValue; 
    } 
}