Xunit 使用 Moq 测试 RestSharp

问题描述 投票:0回答:1

我正在尝试在 xunit 中测试我的类(见下文),该类应该连接到 API 并获取所有客户,即我分页的响应。我无权访问 API,如何在 Xunit 中模拟它,我正在使用 moq 和 Restsharp。我遇到的问题是创建模拟响应并设置模拟。我只需要验证我的状态是否正常并返回 ID

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;

        }
    }
}
moq xunit restsharp
1个回答
0
投票

首先我们定义IRestClientFactory接口:

public interface IRestClientFactory
{
    IRestClient CreateClient(string baseUrl);
}

接下来,让我们使用 xUnit、Moq 和 RestSharp 编写单元测试来模拟 API 响应:

using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using Moq;
using Newtonsoft.Json;
using RestSharp;
using Xunit;

namespace YourNamespace.Tests
{
    public class TopLevelCustomersClientTests
    {
        [Fact]
        public async Task GetAllCustomers_Should_Return_CustomerIds()
        {
            // Arrange
            var loggerMock = new Mock<ILogger>();
            var restClientFactoryMock = new Mock<IRestClientFactory>();
            var restClientMock = new Mock<IRestClient>();

            restClientFactoryMock.Setup(f => f.CreateClient(It.IsAny<string>())).Returns(restClientMock.Object);

            var responseData = new CustomerResponse
            {
                TopLevelCustomerIds = new List<string> { "id1", "id2", "id3" },
                Next = null // Assuming there's no next page
            };

            var serializedResponse = JsonConvert.SerializeObject(responseData);

            var responseMock = new Mock<IRestResponse>();
            responseMock.SetupGet(r => r.IsSuccessful).Returns(true);
            responseMock.SetupGet(r => r.Content).Returns(serializedResponse);
            responseMock.SetupGet(r => r.StatusDescription).Returns("OK");

            restClientMock.Setup(c => c.GetAsync(It.IsAny<IRestRequest>())).ReturnsAsync(responseMock.Object);

            var client = new TopLevelCustomersClient("http://example.com", loggerMock.Object, restClientFactoryMock.Object);

            // Act
            var result = await client.GetAllCustomers();

            // Assert
            Assert.Equal(3, result.Count); // Assuming the mock response contains 3 customer ids
            // Add more assertions as needed
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.