2011-01-26 2 views
9

Я хочу MOq следующий объект:Moq свойство с защищаемой сеттер

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

так что new Mock<Foo>().Bar возвращение "Blah".

Как я могу это сделать?


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

бросает

Failure: System.NotSupportedException: Invalid установку на невиртуальном члена: s => s.Date

и

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

throws

Чтобы задать настройки для публичной собственности StatementSection.Date, использовать набранные перегрузки

ответ

7

С насмехаясь делаются путем создания прокси вашего класса, только виртуальная функции/свойство может быть «moqued»

+0

Так как действовать? Вызовите свойство setter используя отражение? Изменить свойство, чтобы сделать виртуальным? – abatishchev

+0

Я думаю, что единственная применимая - вторая. –

7

Как Felice (+1) сказал, что mocking создает прокси-сервер, что означает, что вам нужно либо сделать что-то виртуальным (поэтому Moq может работать с его прокси-маской и переопределять свойство).

В качестве альтернативы, если вы просто хотите, чтобы впрыснуть в значение, которое вы можете вручную окурок класс, который вы хотите проверить и выставить средство, чтобы получить в инкубаторе: -

public class FooStub : Foo { 
    public SetBar(string newValue) { 
     Bar = newValue; 
    } 
} 
Смежные вопросы