Xunit testing restsharp with Moq

53 Views Asked by At

I'm trying to test my class (se below) in xunit that is supposed to connect to an API and get all customers , the response I paginated. I don't have access to the API how can I mock this in Xunit, I'm using moq and restsharp. What I'm having problems with is creating the mocked responses and setting up the mock. I just need to verify that I get an ok status and and id back

namespace test
{
    public partial class TopLevelCustomersClient : ITopLevelCustomersClient
    {
        private readonly ILogger _logger;
        private readonly IRestClientFactory _restClientFactory;
        private readonly string _baseUrl;

        public TopLevelCustomersClient(string baseUrl, ILogger logger, IRestClientFactory restClientFactory)
        {
            _baseUrl = baseUrl;
            _logger = logger;
            _restClientFactory = restClientFactory;
        }

        public async Task<List<string>> GetAllCustomers()
        {
            string url = _baseUrl + "customers";
            List<string> allCustomerIds = new List<string>();

            try
            {
                _logger.Information("Starting at URL: {Url}", url);

                while (!string.IsNullOrEmpty(url))
                {
                    var client = _restClientFactory.CreateClient(url);
                    var request = new RestRequest();

                    var response = await client.GetAsync(request);

                    if (!response.IsSuccessful)
                    {
                        throw new Exception($"Error getting customers: {response.StatusDescription}");
                    }

                    _logger.Information("Response status: {StatusDescription}", response.StatusDescription);

                    var content = response.Content;

                    _logger.Debug("Raw JSON response: {Content}", content);

                    var responseData = JsonConvert.DeserializeObject<CustomerResponse>(content);

                    _logger.Information("Deserialized response: {ResponseData}", responseData);

                    if (responseData?.TopLevelCustomerIds != null)
                    {
                        _logger.Information("Adding {Count} customer IDs:", responseData.TopLevelCustomerIds.Count);
                        allCustomerIds.AddRange(responseData.TopLevelCustomerIds);
                    }
                    else
                    {
                        _logger.Warning("Missing 'topLevelCustomerIds' property in response");
                    }

                    url = responseData?.Next;
                }

                return allCustomerIds;

        }
    }
}
1

There are 1 best solutions below

0
quyentho On

Try WireMock

var server = WireMockServer.Start();

server
  .Given(
    Request.Create().WithPath("/some/thing").UsingGet()
  )
  .RespondWith(
    Response.Create()
      .WithStatusCode(200)
      .WithHeader("Content-Type", "text/plain")
      .WithBody("Hello world!")
  );