0

I need to test an action method inside a controller. I need to call the HttpGet method with parameters.

Here's my code:

[HttpGet("Date/{endDate}/client/{client}")]
public IActionResult GetClient(
    DateTime endDate,
    string client,
    [FromQuery] DateTime creationDate,
    [FromQuery] string[] portfolios,
    [FromQuery] bool includeGeneric = false)
{
    var result = new List<Portfolio>();
    var param = new PortfoliosParams(portfolios, new[] { client }, endDate, creationDate);

    var portfolios = this.repository.GetPortfolios(param);
    result.AddRange(portfolios);

    var portfolioRepository = this.portfolioRepository.GetPortfolioRepository(param);
    result.AddRange(portfolioRepository);

    var params = new PortfoliosParams(portfolios, new[] { Helpers.ClientName }, endDate, creationDate);

    var genericPortfolios = this.repository.GetPortfolios(params);
     result.AddRange(genericPortfolios);

     var genericPortfoliosRepository = this.portfolioRepository.GetPortfolioRepository(params);
     result.AddRange(genericPortfoliosRepository);
     return this.Ok(result);
}

And this is the test for this method:

[Test]
public async Task GetPortfolios()
{
    var client = "TEST";
    var creationDate = new DateTime(2023, 5, 1);
    var endDate = new DateTime(2024, 1, 1);

    var server = TestHelpers.CreateTestServer();
    var client = server.CreateClient();

    var portfolios = new[] { "TEST1", "TEST2", "TEST3" };

    var result = await client.GetAsync("api/Portfolios/Date/{endDate}/client/{client}", endDate, client, creationDate, portfolios);

    Assert.That(result, Is.EqualTo(3));
}

public static class TestHelpers
{
    private static WebApplicationFactory<Program> testServer;

    public static WebApplicationFactory<Program> CreateTestServer()
    {
        if (testServer != null)
        {
            return testServer;
        }

        return testServer =
            new WebApplicationFactory<Program>()
                .WithWebHostBuilder(builder =>
                    builder
                        .UseContentRoot(Directory.GetCurrentDirectory()));
    }
}

This test however doesn't work because of the parameters. How do I pass the parameters together with the query string correctly?

Thanks

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Garry A
  • 383
  • 5
  • 19

1 Answers1

0

In the most primitive way it can look like this

        var client = "TEST";
        var endDate = new DateTime(2024, 1, 1);
        var creationDate = new DateTime(2023, 5, 1);
        var portfolios = new[] { "TEST1", "TEST2", "TEST3" };

        var requestUri =
            $"WeatherForecast/Date/{endDate}/client/{client}"
            + $"?creationDate={creationDate}"
            + $"&portfolios={portfolios[0]}&portfolios={portfolios[1]}&portfolios={portfolios[2]}";
        var result = await client.GetAsync(requestUri);

But without url encoding it can lead to troubles in some cases. So more advanced solution is described in this related question - Any way to add arrays into HTTP request URI by using C#?

Eugene
  • 169
  • 1
  • 6