Как вы можете использовать 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.IMocked
1 [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
по сути, ничего не сделает для ваших тестов (если это проблема) - он просто вернет уже созданный макет при первом его использовании