Почему Moq.SetupGet создает исключение NotSuportedException - PullRequest
0 голосов
/ 03 октября 2019

Moq.SetupGet выдает исключение.

Почему?

Как это сделать правильно, если у меня нет способа, как изменить тестируемый класс (я не могу добавить интерфейс или сделатьсвойство виртуальное или что-то в этом роде)

Класс

public class ToDelete
{
    public int ToDeleteProperty
    {
        get;
        set;
    }
}

Тест

[TestMethod]
public void PutCaseByIdCaseContactsExperimental()
{
    var toDelete = new Mock<ToDelete>();
    toDelete.SetupGet(x => x.ToDeleteProperty).Returns(5); //<------throws exception below

    Assert.AreEqual(toDelete.Object.ToDeleteProperty, 5);
 }

Результат StackTrace: v Moq.Guard.IsOverridable (метод MethodInfo, Expressionвыражение) v Moq.InvocationShape..ctor (выражение LambdaExpression, метод MethodInfo, аргументы IReadOnlyList'1) v Moq.ExpressionExtensions.g__Split | 4_1 (выражение e, выражение & r, InvocationShape & p) v Moq.ExpressionExtensions.Split (выражение) vambdaMoq.Mock.Setup (фиктивный макет, выражение LambdaExpression, условие условия) v Moq.Mock.SetupGet (фиктивный макет, выражение LambdaExpression, условие условия) v Moq.Mock 1.SetupGet[TProperty](Expression 1 выражение v v Cnx.Csm.CaseManagement.Test. Controllers.CaseControllerTest.PutCaseByIdCaseContactsExperimental () v C: \ tfs ____ Test.cs: строка 682 Сообщение о результате: метод теста ____________________ Test ._______________ сгенерировано исключение: System.NotSupportedException: неподдерживаемое выражение: x => x.ToDeleteProperty Не переопределяемые члены (здесь: CaseControllerTest.ToDelete.get_ToDeleteProperty) не могут использоваться в выражениях настройки / проверки.

1 Ответ

0 голосов
/ 03 октября 2019

Вы пытаетесь смоделировать не виртуальный тип.

По сути, под капотом Moq создает прокси, который реализует, наследует от типа, который должен быть смоделирован, и переопределяет свойства и методы своими собственными.

Обычно Moq готов предоставить реализации теста для abstract типов, таких как базовые классы и интерфейсы, которые не могут или не должны использоваться в тесте (для дизайна или для простоты).

Youможет заставить ваш сценарий работать, когда вы объявите свою собственность следующим образом:

public virtual int ToDeleteProperty

, хотя я бы не рекомендовал менять ваш класс таким образом.

...