Вы можете смоделировать свой репозиторий следующим образом:
var mockUserRepo = new Mock<ICustomerInquiryMockRepository>();
mockUserRepo.Setup(x => x.GetCustomers())
.Returns(Task.FromResult(MockData.Current.Customers.AsEnumerable());
mockUserRepo.Setup(x => x.GetCustomer(It.IsAny<int>()))
.Returns(res => Task.FromResult(MockData.Current.Customers.ElementAt(res));
Если вы хотите смоделировать конкретные значения для GetCustomer
, вы можете сделать:
mockUserRepo.Setup(x => x.GetCustomer(It.Is<int>(y => y == 4)))
.Returns(res => Task.FromResult(/* error value here */));
Я думаю, чтоЗдесь ключом является использование It.Is
или It.IsAny
в зависимости от того, как вы хотите смоделировать объект.Как правило, вы также хотите макетировать интерфейсы, которые используются в производственном коде, вместо того, чтобы производственный код зависел от чего-то с Mock
или Test
в имени.Я бы рекомендовал не принимать зависимость производственного кода от чего-то с именем ICustomerInquiryMockRepository
, если это действительно то, что вы делаете, а не просто часть MCVE, которую вы предоставили.
Тесты обычно используют макеты для проверкиРабочий процесс приложения находится на высоком уровне, поэтому вы обычно хотели бы смоделировать уровень своих услуг, вызвать контроллер и убедиться, что службы были вызваны так, как ожидалось.Например:
// Production class sample
class ProductionController
{
public ProductionController(IService1 service1, IService2 service2) { }
public void ControllerMethod()
{
var service1Result = service1.Method();
service2.Method(service1Result);
}
}
// Test sample
// arrange
var expectedResult = new Service1Result();
var service1 = Mock.Of<IService1>(x => x.Method() == expectedResult);
var service2 = Mock.Of<IService2>(x => x.Method(It.Is<Service1Result>(y => y == expectedResult)));
var controller = new ProductionController(service1, service2);
// act
controller.ControllerMethod();
// assert
Mock.Get(service1).Verify(x => x.Method(), Times.Once);
Mock.Get(service2).Verify(x => x.Method(expectedResult), Times.Once);
Как видно из примера, вы не проверяете бизнес-логику какой-либо из служб, вы просто проверяете, что методы были вызваны с ожидаемыми данными.Тест построен на проверке методов, которые называются , а не какой-либо конкретной логики ветвления.
Кроме того, независимо от вашего вопроса, Moq также имеет классный синтаксис, который вы можете использовать для простогонастройки макета:
var repo = Mock.Of<ICustomerInquiryMockRepository>(x =>
x.GetCustomers() == Task.FromResult(MockData.Current.Customers.AsEnumerable()));
Вы можете использовать Mock.Get(repo)
, если вам нужно выполнить дополнительную настройку в хранилище.Это определенно стоит проверить, мне гораздо приятнее читать.