Как вы можете использовать Lazy<> с AutoMock (Moq)

Мы используем Autofac.Extras.Moq.AutoMock. Теперь у меня есть зависимость конструктора с помощью Lazy<>

public MyService(Lazy<IDependency> myLazyDependency) {...}

тестировать MyService нам нужно издеваться над Lazy<Dependency>,

Я пытаюсь это с

[ClassInitialize]
public static void Init(TestContext context)
{
    autoMock = AutoMock.GetLoose();
}

[TestInitialize]
public void MyTestInitialize()
{
     var myDepMock = autoMock.Mock<Lazy<IDependency>>();  // <-- throws exception
}

Это исключение, возвращаемое исполнителем теста:

Метод инициализации Tests.MyServiceTests.MyTestInitialize вызвал исключение. System.InvalidCastException: System.InvalidCastException: невозможно преобразовать объект типа 'System.Lazy1[IDependency]' to type 'Moq.IMocked1 [System.Lazy`1 [IDependency]]"..

Итак, как я могу передать объект Lazy<>, используя автомок.

1 ответ

Решение

Вам не нужно издеваться Lazy, поскольку это является частью структуры (за исключением некоторых экстремальных обстоятельств). Вы можете просто издеваться IDependency и передать высмеянный объект Lazy,

Примерно так должно работать:

var mockDependency = autoMock.Mock<IDependency>();
var mockObject = mockDependency.Object; //(Not entirely sure of the property for this library)
var mockedLazy = new Lazy<IDependency>(() => mockObject);

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

Другие вопросы по тегам