簡體   English   中英

Azure Function C# 中的單元測試

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM