Moq - Как настроить интерфейс Lazy - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу смоделировать Lazy Interface, а также Setup метод для возврата false.

Проблема в том, что при запуске теста я получаю NotSupportedException:

System.NotSupportedException: 'Недопустимая установка для не виртуального (переопределяемого в VB) члена: mock => mock.Value

Вот упрощенный пример:

[TestMethod]
public void SomeTestMethod()
{
    var someService = new Mock<Lazy<IService>>();

    /*this line throws the exception*/  
    someService.Setup(x => x.Value.SomeMethod()).Returns(false);
    ...
}

Обратите внимание, что SomeMethod на самом деле является виртуальным, но каким-то образом получение отложенной инициализации с помощью x.Value не поддерживается Moq.

Я не нашел решения для этого конкретного сценария, но я просмотрел некоторые другие подходына заявлениях, но, к сожалению, не работает для меня.

[TestMethod]
public void SomeTestMethod()
{
    var someService = new Mock<IService>();
    var lazySomeService = new Lazy<IService>(() => someService.Object);

    //tried this but won't compile
    //lazySomeService.Setup(x => x.Value.SomeMethod()).Returns(false);
    //lazySomeService.Value.Setup(x => x.SomeMethod()).Returns(false);
    ...
}

1 Ответ

0 голосов
/ 06 февраля 2019

Вы начали на правильном пути с

var someService = new Mock<IService>();
var lazySomeService = new Lazy<IService>(() => someService.Object);

, но установка должна быть на макете, а не на фактической реализации Lazy.

someService.Setup(x => x.SomeMethod()).Returns(false);

Таким образом, когда Lazy.Value называется, он будет использовать макет.

...