Как выполнить интеграционный тест на контроллере WebApi с помощью FakeItEasy? - PullRequest
0 голосов
/ 17 мая 2018

Я новичок в реализации юнит-тестов и интеграционных тестов. Я пытаюсь написать несколько интеграционных тестов для моего приложения. Ниже приведены фрагменты кода из моего приложения, чтобы дать вам полное представление о моем коде. Было бы очень полезно, если бы вы могли дать мне некоторое руководство для этого.

namespace MyApplication.ApiControllers
{
    [Authorize]
    [RoutePrefix("api/customers")]
    [AppExceptionFilter]
    public class CustomersController : ApiController
    {
        private readonly IMediator _mediator;

        public CustomersController(IMediator mediator)
        {
           _mediator = mediator;
        }

        [HttpGet]
        [Route("GetCustomer")]
        public async Task<IHttpActionResult> GetCustomer(string customerNumber, string customerType = null)
        {
            var result = await _mediator.RequestAsync(new GetCustomerRequest(customerNumber, customerType));
            return Ok(result);
        }
    }
}

Ниже приведена реализация обработчика GetCustomerRequest

public async Task<List<Customer>> HandleAsync(GetCustomerRequest request)
{
    var result = await customerService.GetCustomer(request.CustomerNumber, request.CustomerType);
    // some business logic 
    return result;
}

Ниже приводится реализация для customerService

public async Task<List<Customer>> GetCustomer(string customerNumber, string customerType = null)
{

    using (var dataContext = _dataContextFactory.Invoke())
    {
        result = await dataContext.Customers
            .Where(b => b.CustomerNumber == customerNumber)
            .Where(b => b.CustomerType == customerType)
            .Select(b => new Customer
            {
                // Properties assignment...
            })
            .ToListAsync();
    }

    return result;
}

Ниже приведен тест модуля интеграции, который я пробовал.

namespace MyApplication.Tests.Integrations
{
    [TestFixture]
    public class CustomersControllerTests
    {
        private string _baseAddress;
        private string _username;
        private string _password;
        private IApiClient _apiClient;

        [SetUp]
        public void Setup()
        {
            _baseAddress = "https://mywebaaplication.com"; // TODO get this from a config
            _username = "";
            _password = "";
            _apiClient = new ApiClient(new ApiClientAuthenticationHandler(), _baseAddress);  // REPLACE with AzureADApiClientAuthenticationHandler
        }

        [Test]
        public async Task CustomersController_GetCustomer()
        {
            var customerNumber = string.Empty;
            var customerType = 500;
            var result = await _apiClient.GetAsync<Customer[]>($"/api/customers/GetCustomer?customerNumber={customerNumber}&customerType={customerType}");
            Assert.IsNotNull(result);
            Assert.IsTrue(result?.Length > 0);
        }
    }
}

1 Ответ

0 голосов
/ 30 июля 2019

Вы можете сделать несколько вещей:

  1. Создайте веб-хост в вашем модульном тесте, затем выполните http-запросы против него
  2. Не тестируйте свой контроллер в модульном тесте, но проверяйте его работоспособность / готовность (потому что в любом случае это просто клейкий код). Просто проведите интеграционное тестирование для своего сервиса.
  3. Просто протестируйте против "нового CustomersController"

Здесь нет правильного / неправильного ответа. Вы просто смотрите на риски и тестируете соответственно. Также зависит от типа изменений кода, которые вы ожидаете. Иногда хорошо создать тест только в контексте нового изменения, не нужно предвидеть все.

...