2010-09-23 1 views
2

Я пытаюсь определить возвращаемое значение для Mock (model).Moq SetupGet ошибки, но установка свойства на .Object работает отлично

Может кто-нибудь объяснить мне, почему следующий код не с «Invalid установки на не переопределение члена»:

model.SetupGet(x => x.PostCodeSearch).Returns(It.IsAny<string>); 

и все же я могу это сделать, и это работает прекрасно:

model.Object.PostCodeSearch = "Any value as long as it's not null or empty"; 

Сообщение об ошибке достаточно ясно, но кажется странным, что я могу применить значения к свойствам непосредственно в свойстве Object. Какой смысл SetUpGet, если я могу сделать последнее?

ответ

1

Убедитесь, что PostCodeSearch объявлен virtual на поддельных типах.

public virtual string PostCodeSearch { get; set; } 

MOQ может фальсифицировать только свойства, которые переопределение.

Edit: дело с не overridables

Если Faked тип не может быть изменен есть различные альтернативы:

Изменить код производства использовать обертку из фальшивого класса. Оболочка будет иметь тот же API, что и обернутый класс, и все, что он будет делать, - это маршрут вызовов к обернутому объекту. Обертка объявит методы и свойства как virtual. Таким образом, вы получите такое же поведение в коде с небольшими изменениями.

Например, если исходный класс быть сфальсифицирована является MyClass:

public class MyClassWrapper 
{ 
    MyClass myClass; 

    MyClassWrapper(MyClass myClass) 
    { 
     this.myClass = myClass; 
    } 

    public virtual string PostCodeSearch 
    { 
     get { return myClass.PostCodeSearch; } 
     set { myClass.PostCodeSearch = value; }; 
    } 
} 

Код производства будет использовать MyClassWrapper вместо MyClass, и это будет сделать код проверяемых с помощью этого мало изменений.

Другой альтернативой является использование изоляции. рамки изоляции позволяют притворяется не-перегружаемых членов, статические члены, запечатанных классы ...

Например, с помощью Typemock Isolator:

MyClass myClass = new MyClass(); 
Isolate.WhenCalled(() => myClass.PostCodeSearch).WillReturn("faked value"); 

В этом примере подделать поведениие установлен непосредственно на оригинальном классе. Преимущество здесь в том, что в производственном коде не требуется никаких изменений, чтобы сделать его проверяемым.

Отказа от ответственности - Я работаю в TypeMock

+0

Хорошо, но когда у меня нет доступа к источнику моего использование .Object поэтому справедливо? –

+0

@Daz Lewis, это немного более интересный случай, обновленный ответ – Elisha

Смежные вопросы