我正在尝试对 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 函数进行单元测试
尝试使用以下代码:- 将
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");
}
}
}
输出:-