[英]Unit Test in Azure Function C#
我想通過發送模擬請求和響應數據來對我的天藍色函數 API 進行單元測試。 但是即使我在請求和響應中都傳遞了相同的 Json 數據,我的測試也會失敗。 測試代碼
[TestMethod]
public async Task ClinicReadTestMethod()
{
//Arrange
//var clinicRequest = new
//{
// Id = "1",
// OpenIdProvider = "Google",
// Subject = "Test",
// Name = "Test",
// Address = "Test",
// Email = "Test",
// Phone = "Test",
// Notes = "Test"
//};
var query = new Dictionary<string, StringValues>();
query.Add("openIdProvider", "Google");
query.Add("subject", "Test");
//var body = JsonSerializer.Serialize(clinicRequest);
var logger = Mock.Of<ILogger>();
var client = Mock.Of<CosmosClient>();
ContentResultFactory contentResultFactory = new ContentResultFactory();
//Act
var testFunction = new ClinicReadFunction(contentResultFactory);
var result = await testFunction.Run(TestFactory.HttpRequestSetup(query), client, logger); //fixme
var resultObject = JsonSerializer.Serialize(result as ContentResult);
//Assert
var clinicResponse = new
{
Id = "1",
openIdProvider = "Google",
subject = "Test",
Name = "Test",
Address = "Test",
Email = "Test",
Phone = "Test",
Notes = "Test"
};
var resultBody = JsonSerializer.Serialize(clinicResponse);
//var res = contentResultFactory.CreateContentResult(HttpStatusCode.OK);
Assert.AreEqual(resultBody, resultObject);
}
}
這就是我的天藍色函數的樣子。 它采用兩個參數並返回響應。 我試圖模擬單元測試的數據仍然沒有成功。 如果有人知道如何對這個天藍色函數進行單元測試,請告訴我。 //Azure函數
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = "")] HttpRequest req,
[CosmosDB(
databaseName: "",
containerName: "",
Connection = ""
)] CosmosClient client,
ILogger log)
{
string subject = req.Query["sub"];
if (!Enum.TryParse(req.Query["idp"], out OpenIdProvider openIdProvider) || string.IsNullOrEmpty(subject))
{
var message = "";
log.LogWarning();
return _contentResultFactory.CreateContentResult(message, HttpStatusCode.BadRequest);
}
var query = client.GetContainer("", "").GetItemLinqQueryable<Clinic>()
.Where(x => x.OpenIdProvider == openIdProvider && x.Subject == subject);
Clinic clinic;
using (var iterator = query.ToFeedIterator())
clinic = (await iterator.ReadNextAsync()).FirstOrDefault();
if (clinic == null)
{
log.LogWarning();
return _contentResultFactory.CreateContentResult();
}
var response = new ClinicReadResponse(clinic);
return _contentResultFactory.CreateContentResult(response, HttpStatusCode.OK);
}
//測試工廠
public static HttpRequest HttpRequestSetup(Dictionary<string, StringValues> query, string body)
{
var reqMock = new Mock<HttpRequest>();
reqMock.Setup(req => req.Query).Returns(new QueryCollection(query));
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(body);
writer.Flush();
stream.Position = 0;
reqMock.Setup(req => req.Body).Returns(stream);
return reqMock.Object;
}
public static HttpRequest HttpRequestSetup(Dictionary<string, StringValues> query)
{
var reqMock = new Mock<HttpRequest>();
reqMock.SetupGet(x => x.Query).Returns(new QueryCollection(query));
return reqMock.Object;
}
在您的兩個診所對象中,您正在通過調用 System.Guid.NewGuid 為 ID 生成一個新的 GUID。 假設從每個對象生成的 JSON 具有相同的形狀(如果您希望它們匹配,則需要它們),每個 ID 屬性的值將不同。 由於 ID 不同,您的 JSON 字符串不相等,因此導致失敗。
這是一篇文章,將向您展示如何手動創建 Guid。 您可以使用它來確保您的 ID 在測試時具有相同的值。 在 C# 中分配 GUID
我不知道您的 Azure 函數代碼是什么樣的,但是您發出 HTTP 請求的測試設置告訴我您正在調用與 Http 觸發器相關的方法。 考慮你的方法的作用范圍; 如果它很大(或正在調用其他方法),隨着時間的推移更改 Azure 函數,這將增加測試中斷的機會。 為了幫助您的測試適應未來,請確保它調用的方法具有單一職責。 如果更改確實使您的測試失敗,這將使您的代碼更容易調試,並且將減少需要編輯測試以適應代碼更改的可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.