使用 MsTest 进行单元测试 Azure 函数错误:未为工作线程配置序列化器

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

我正在尝试对 azure 函数 API 端点进行单元测试,并且在 WriteAsJsonAsync 上出现此异常:

这是我的测试:

[TestMethod, TestCategory("CreateOpportunity")]
public void CreateOpportunity_OK()
{
    //// Test parameters
    string testRequest = Crm2CrmTestModels.GetRequest();
    OpportunityCreateResponse testOpportunityCreateResponse = Crm2CrmTestModels.GetOpportunityCreateResponse();

    ServiceCollection serviceCollection = new ServiceCollection();
    serviceCollection.AddScoped<ILoggerFactory, LoggerFactory>();
    ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();

    Mock<FunctionContext> context = new Mock<FunctionContext>();
    context.SetupProperty(c => c.InstanceServices, serviceProvider);

    MemoryStream body = new MemoryStream(Encoding.ASCII.GetBytes(testRequest));
    FakeHttpRequestData request = new FakeHttpRequestData(
                    context.Object,
                    new Uri("https://test.com"),
                    body);

    // Setup mocks
    Mock<ICrm2CrmBusiness> mockCrm2CrmBusiness = new(MockBehavior.Strict);
    mockCrm2CrmBusiness.Setup(b => b.Exists(It.IsAny<Opportunity>())).ReturnsAsync(It.IsAny<string>());
    mockCrm2CrmBusiness.Setup(b => b.CreateOpportunity(It.IsAny<Opportunity>())).ReturnsAsync(testOpportunityCreateResponse);

    ICrm2CrmBusiness consentsBusiness = mockCrm2CrmBusiness.Object;

    ILogger<Crm2CrmFunction> logger = new Mock<ILogger<Crm2CrmFunction>>().Object;

    Mock<ICrm2CrmAdapter> mockCrm2CrmAdapter = new(MockBehavior.Strict);
    mockCrm2CrmAdapter.Setup(b => b.ConvertToBusiness(It.IsAny<Crm2Crm.FunctionsApp.Models.Request.Opportunity>())).Returns(It.IsAny<Opportunity>());

    ICrm2CrmAdapter crm2CrmAdapter = mockCrm2CrmAdapter.Object;

    // Execute
    Crm2CrmFunction functions = new(logger, consentsBusiness, crm2CrmAdapter);
    //A serializer is not configured for the worker
    HttpResponseData result = functions.CreateOpportunity(httpRequest: request, context.Object).Result;

    mockCrm2CrmBusiness.Verify(b => b.Exists(It.IsAny<Opportunity>()).Result, Times.Never);
    mockCrm2CrmBusiness.Verify(b => b.CreateOpportunity(It.IsAny<Opportunity>()).Result, Times.Never);

    Assert.IsNotNull(result);
    Assert.AreEqual(HttpStatusCode.OK, result.StatusCode);
}

我该如何解决我的问题?

谢谢。

我尝试对包含 WriteAsJsonAsync 的 azure 函数进行单元测试

c# .net-core azure-functions mstest
1个回答
0
投票

尝试使用以下代码:-

YourNamespace
替换为您的函数类:-*

using System;
using System.IO;
using System.Net;
using System.Text;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using YourNamespace;

namespace YourNamespace.Tests
{
    [TestClass]
    public class Crm2CrmFunctionTests
    {
        [TestMethod, TestCategory("CreateOpportunity")]
        public void CreateOpportunity_OK()
        {
            // Arrange
            string testRequest = Crm2CrmTestModels.GetRequest();
            OpportunityCreateResponse testOpportunityCreateResponse = Crm2CrmTestModels.GetOpportunityCreateResponse();

            var serviceCollection = new ServiceCollection();
            serviceCollection.AddScoped<ILoggerFactory, LoggerFactory>();
            var serviceProvider = serviceCollection.BuildServiceProvider();

            var context = new Mock<FunctionContext>();
            context.SetupProperty(c => c.InstanceServices, serviceProvider);

            var body = new MemoryStream(Encoding.ASCII.GetBytes(testRequest));
            var request = new FakeHttpRequestData(
                context.Object,
                new Uri("https://test.com"),
                body);

            var mockCrm2CrmBusiness = new Mock<ICrm2CrmBusiness>(MockBehavior.Strict);
            mockCrm2CrmBusiness.Setup(b => b.Exists(It.IsAny<Opportunity>())).ReturnsAsync(It.IsAny<string>());
            mockCrm2CrmBusiness.Setup(b => b.CreateOpportunity(It.IsAny<Opportunity>())).ReturnsAsync(testOpportunityCreateResponse);

            var consentsBusiness = mockCrm2CrmBusiness.Object;

            var logger = new Mock<ILogger<Crm2CrmFunction>>().Object;

            var mockCrm2CrmAdapter = new Mock<ICrm2CrmAdapter>(MockBehavior.Strict);
            mockCrm2CrmAdapter.Setup(b => b.ConvertToBusiness(It.IsAny<Crm2Crm.FunctionsApp.Models.Request.Opportunity>())).Returns(It.IsAny<Opportunity>());

            var crm2CrmAdapter = mockCrm2CrmAdapter.Object;

            var functions = new Crm2CrmFunction(logger, consentsBusiness, crm2CrmAdapter);

            // Act
            var result = functions.CreateOpportunity(request, context.Object).Result;

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(HttpStatusCode.OK, result.StatusCode);
        }
    }
}

我尝试在我的 Azure Functions 解决方案中创建一个单元测试项目,并且成功运行:-

在现有 Function 项目中添加一个新的

MSTest c#
项目并使用以下代码:-

using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Moq.Protected;

namespace YourNamespace.Tests
{
    [TestClass]
    public class UsersApiTests
    {
        [TestMethod]
        public async Task GetUsersPage2_Returns_OK()
        {
            
            var expectedResponse = "{ \"users\": [ { \"id\": 1, \"name\": \"John Doe\" } ] }"; 

            var mockHttpMessageHandler = new Mock<HttpMessageHandler>();
            mockHttpMessageHandler
                .Protected()
                .Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
                .ReturnsAsync(new HttpResponseMessage
                {
                    StatusCode = HttpStatusCode.OK,
                    Content = new StringContent(expectedResponse),
                });

            var httpClient = new HttpClient(mockHttpMessageHandler.Object);

            var apiClient = new YourApiClient(httpClient);

            var response = await apiClient.GetUsersPage2();

            // Assert
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            
        }
    }

    public class YourApiClient
    {
        private readonly HttpClient _httpClient;

        public YourApiClient(HttpClient httpClient)
        {
            _httpClient = httpClient;
        }

        public async Task<HttpResponseMessage> GetUsersPage2()
        {
            return await _httpClient.GetAsync("https://reqres.in/api/users?page=2");
        }
    }
}

输出:-

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.