c# - 如何在 C# 中模拟来自 httpclient 的响应,Azure 函数,如何测试

标签 c# unit-testing service moq dotnet-httpclient

我有一个静态的 azure 函数,该函数在服务内部有一个 httpclient。

public static void MyAzureFunction ()
{
    ........... 
    // inside run
    var service = new Service(...)

    var result = service.DoSomething(....);
}

另一方面,我有以下内容:

public class Service
{
    ...//my properties
    public Service(...) {...}
    ...
    public Result DoSomething(...)
    {
        var httpClient = new HttpClient();
        //configuring httpClient
        var result = await httpClient.GetAsync(...);
    }    
}

我该如何测试这个?

我所知道的:

  1. 服务对象未注入(inject)到 Azure 函数中,因此我无法发送模拟。相反,它是被创建的。
  2. Azure 函数必须属于静态类,因此我无法使用虚拟或重写方法来绕过任何内容,然后模拟它们。

最佳答案

您可以像测试任何其他程序一样测试它。相比之下,考虑一个控制台应用程序。您通常不会测试 Main,因为这是您编写所有内容的地方。对于 ASP.NET 应用程序也是如此,您很少直接测试 Startup。相反,您将它们视为 Humble Objects 。虽然您不测试它们,但您也会耗尽它们的逻辑。

类似 MyAzureFunction 的启动代码就属于该类别。虽然您可能无法直接对该函数进行单元测试,但您可以将其视为函数的 Composition Root :

public static void MyAzureFunction()
{
   var service = new Service(new Dependency())
   var result = service.Dosomething(...);
}

组合根应该做的唯一事情是组合一个对象图并委托(delegate)给一个完成所有工作的方法。

这意味着您现在可以测试其他所有内容(如果您进行相应的设计)。

例如,在这里,我们更改了 Service,以便它在其构造函数中获取依赖项。如果您设计该依赖项以使其具有适当的多态性,那么您现在可以使用 Test Doubles 测试 Service .

关于c# - 如何在 C# 中模拟来自 httpclient 的响应,Azure 函数,如何测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77261821/

相关文章:

symfony - 如何使用注释将 Controller 定义为服务?

c++ - 如何将 Golang 编写的应用程序作为 Windows 服务运行

c# - MSBuild : bin/release folder is not getting created

c# - 派生类上没有扩展方法 'First'

c# - moq No setups configured error,如何快速正确添加setup

python - 我可以在第一个断言失败后测试测试的所有断言吗?

php - 让php脚本作为linux服务运行

c# - 阵列变化事件

c# - 使用 Thread.Sleep() 总是不好的吗?

iphone - 在 iPhone 中创建虚拟音频文件