【问题标题】:Azure Function unit test issue [closed]Azure 功能单元测试问题 [关闭]
【发布时间】:2020-05-28 15:51:18
【问题描述】:

在向 Azure Functions 编写单元测试时如何设置环境变量?

下面是一个给定的示例代码,其中原始函数使用键 sqldb_conn 从环境变量中获取 SQL 连接字符串。

namespace LoanData.API
{
    public static class LoanFunction
    {

        [FunctionName("get-loan")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation($"C# HTTP trigger function executed at: {DateTime.Now}");

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            List<Models.Loan> loan = new List<Models.Loan>();

            var SqlConnStr = Environment.GetEnvironmentVariable("sqldb_conn");

            try
            {
                String commandText = "SELECT * FROM [dhub_data].[LOAN_INFO_V2]";
                using (SqlDataReader reader = Utils.SQLHelper.ExecuteReader(SqlConnStr, commandText, CommandType.Text, null))
                {
                    if (!reader.HasRows)
                    {
                        log.LogInformation("No data returned");
                    }

                    while (reader.Read())
                    {
                        Models.Loan loan = new Models.Loan();
                        loan.ID =  SQLReaderExtensions.SafeGetString(reader, "ID");
                        loan.NAME = SQLReaderExtensions.SafeGetString(reader, "NAME");
                        loan.LAST_UPDATE_DATE = SQLReaderExtensions.SafeGetString(reader, "LAST_UPDATE_DATE");
                        loan.CREATED_BY = SQLReaderExtensions.SafeGetString(reader, "CREATED_BY");
                        loan.CREATION_DATE = SQLReaderExtensions.SafeGetString(reader, "CREATION_DATE");
                        loanResponse.Add(loan);
                        log.LogInformation(loan.ToString());
                    }
                    reader.Close();
                }

                if (loanResponse.Count > 0)
                {
                    return new OkObjectResult(loanResponse);
                }
                else
                {
                    return new NotFoundResult();
                }
            }
            catch (Exception ex)
            {
                log.LogError(ex.Message);
                return new BadRequestObjectResult(ex.Message);
            }
        }
    }
}

这是为上述 Azure Function 编写的示例测试代码:

[Fact]
public async void Http_trigger_should_return_known_string()
{
    var request = TestFactory.CreateHttpRequest("name", "Bill");
    var response = (OkObjectResult)await HttpTrigger.Run(request, logger);
    Assert.Equal("Hello, Bill", response.Value);
}

如何修改它以适应我的功能?关注https://docs.microsoft.com/en-us/azure/azure-functions/functions-test-a-function

【问题讨论】:

  • 您最初的问题是如何设置环境变量,这就是我回答解决方案的原因。您更新了问题并删除了该部分。即使您正在编辑原始问题,也请保留您的原始问题。您可以使用 EDIT 标签添加新零件。为了能够测试您的代码,您必须遵循 SOLID 原则。在您的代码上,您正在调用打开数据库连接并执行阅读器的静态方法。最好将您的数据访问逻辑分开并将其注入您的 Azure Functions 以便您可以对其进行测试。
  • 嗨,Nazim。感谢您的回答。我试图发布我的问题。我在编辑和发布更新的问题时遇到了一些问题。我不得不截断我的问题的一部分。对不起,

标签: c# azure function xunit.net


【解决方案1】:

您可以在单元测试中手动设置如下:

Environment.SetEnvironmentVariable("key", "value");

【讨论】:

  • 这是因为您从 HttpTrigger.Run 方法中获取了 BadRequest,并且您正试图将其转换为 OkObjectResult。您可以在测试时调试您的 run 方法,检查 BadRequest 来自哪里。
  • 感谢Nazim 的回复。这是我的第一个函数,正在尝试编写单元测试。
  • 那很好,希望你好好学习 Azure Functions。您还有什么未解决的问题吗?
  • 嗨,Nazim,是的,我有问题。在您之前的帖子中,您提到最好将您的数据访问逻辑分离并将其注入您的 Azure Functions,以便您可以对其进行测试。我在一个功能应用程序中有几个功能。所以我只有打开连接并在帮助类中返回阅读器的逻辑。我正在格式化函数中的响应并返回它。我怎样才能以更好的方式做到这一点?感谢您的帮助
  • 您可以使用此链接 docs.microsoft.com/en-us/azure/azure-functions/… 将您的服务注入您的 Azure Functions。您应该创建一个单独的项目来执行数据库操作。我建议使用带有实体框架的存储库模式。在该项目中,您可以定义接口并将这些接口注入到您的函数中。因此,您可以在测试函数时模拟此接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多