Moq SetupGet ошибки, но установка свойства на .Object работает нормально - PullRequest
2 голосов
/ 23 сентября 2010

Я пытаюсь определить возвращаемое значение для макета (модель).

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

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 Ответ

1 голос
/ 23 сентября 2010

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

public virtual string PostCodeSearch { get; set; }

moq может подделывать только свойства, которые могут быть переопределены.

Редактировать: работа с не переопределяемыми

Если поддельный тип не может быть изменен, есть разные альтернативы:

Измените производственный код, чтобы использовать оболочку поддельного класса.Оболочка будет иметь тот же 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

...