Я планировал написать тестовую базу для прокси / оболочек, которые у нас есть для нескольких сервисов. Каждый из прокси просто конвертирует модель в TIn, вызывает метод в сервисе, который возвращает TOut. Для каждого прокси-сервера единственным изменением является то, что базовый сервис отличается от того, что это просто стандартный код внутри каждого прокси-сервера.
class TestBase<TSvc, TProxy>
{
private Mock<TSvc> svcMock = new Mock<TSvc>();
private Mock<IMapper> mapperMock = new Mock<IMapper>();
private TProxy proxy;
protected void TestServiceCall<TIn, TOut>(Func<TSvc, Func<TIn, TOut>> svcCallFunc, TInModel model,
Func<TProxy, TInModel, TOutModel> methodToTest)
{
var input= new TIn();
var svcResult = new TOut();
var proxy = ConstructProxy(this.svcMock);
this.mapperMock.Setup(m => m.Map<TInModel, TInput>(model)).Returns(input);
this.svcMock.Setup(m => svcCallFunc(m)(input)).Returns(svcResult);
this.mapperMock.Setup(m => m.Map<TOut, TOutModel>(svcResult)).Returns(output);
var result = methodToTest(model);
... verify if the svc was called etc. ...
result.Should().BeSameAs(output);
}
}
class UserService
{
QuestionModels GetQuestionsByUsers(SearchModel searchModel)
{ .. get all questions that comply with search parameters..}
TopicModels GetTopicsForUsers(TopicSearchModel searchModel)
{ .. get all topics that comply with search parameters..}
}
class UserProxy
{
private UserService service;
private Mapper mapper;
QuestionsClass GetQuestionsByUsers(SearchClass search)
{
var searchModel = mapper.Map<SearchClass, SearchModel>(search);
var svcResult = userService.GetQuestionsByUsers(searchModel);
return mapper.Map<QuestionModels, QuestionsClass>(svcResult);
}
TopicsClass GetTopicsForUsers(TopicSearchClass search)
{
var searchModel = mapper.Map<TopicSearchClass, TopicSearchModel>(search);
var svcResult = userService.GetTopicsForUsers(searchModel);
return mapper.Map<TopicModels, TopicsClass>(svcResult);
}
}
Если вы видите, число шагов, которые каждый метод должен выполнить для получения результата, является постоянным,
- сопоставить запрос с промежуточным типом
- вызов службы для получения результата
- map & return result class
У меня есть десятки таких классов, которые делают примерно то же самое. Каждый из них может иметь около 5-10 таких методов.
Так что я буду sh делать следующее. Таким образом, я могу сэкономить время, затрачиваемое на написание стандартного тестового кода.
[TestClass]
class UserProxyTest : TestBase<UserService, UserProxy>
{
[TestMethod]
void GetQuestionsByUsersTest()
{
this.TestServiceCall<SearchModel, QuestionModels>(
svc => svc.GetQuestionsByUsers,
new SearchClass(), <-- This could be anything
pxy => pxy.GetQuestionsByUsers);
}
[TestMethod]
void GetTopicsForUsers()
{
this.TestServiceCall<TopicSearchModel, TopicModels>(
svc => svc.GetTopicsForUsers,
new TopicSearchClass(), <-- This could be anything
pxy => pxy.GetTopicsForUsers);
}
}
Проблема, которую я получил, заключается в том, что строка, которая устанавливает svcMock, сообщает об ошибке, в которой говорится, что выражение не является методом призывание. Как мне исправить эту проблему?