Написание тестов для контроллеров CRUD, которые следуют этому шаблону.
- Получить один или несколько параметров различных типов из параметров метода действия
- Вызвать некоторый метод IEntityService.GetEntity (параметры из шага 1)
- Если возвращается NULL, вернуть NotFound
- В противном случае вернуть найденный объект
Я неоднократно писал очень похожие тесты.
[TestCase(true)]
[TestCase(false)]
public void GetsAccount(bool isExistingAccount)
{
const int accountId = -1;
var account = isExistingAccount ? new Account() : null;
A.CallTo(() => AccountService.GetAccount(accountId)).Returns(account);
var result = (IStatusCodeActionResult)_controller.GetAccount(accountId);
var statusCode = isExistingAccount ? HttpStatusCode.OK : HttpStatusCode.NotFound;
result.StatusCode.Should().Be((int)statusCode);
Я попытался написать универсальный метод для подделки.
public void GetEntityActionMethodTest<TEntityType>(bool isExisting, Func<int, TEntityType> serviceMethod, Func<int, ActionResult> actionMethod) where TEntityType : class
{
var fakeMethod = A.Fake<Func<int, TEntityType>>();
A.CallTo(() => fakeMethod(-1)).Returns( isExisting ? default(TEntityType) : null);
var result = (IStatusCodeActionResult)actionMethod(-1);
result.StatusCode.Should().Be(isExisting ? (int)HttpStatusCode.OK : (int)HttpStatusCode.NotFound);
}
Есть две проблемы:
1) Не фальсифицируется правильно, чтобы вернуть ноль
2) Предполагается, что метод интерфейса имеет один целочисленный параметр
Вопросы
1) Является ли хорошей идеей работать над созданием универсального метода, который может имитировать методы, которые могут иметь разные подписи в разных интерфейсах, используя FakeItEasy? Как насчет отражения?
2) Если да, как я могу это сделать?
Спасибо.