如何对.NET Core中的Startup.cs进行单元测试

罗伯·厄兰(Rob Earlam):

人们如何对.NET Core 2应用程序中的Startup.cs类进行单元测试?所有功能似乎都是由静态扩展方法提供的,这些方法不是可模拟的吗?

如果以这种ConfigureServices方法为例:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BlogContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddMvc();
}

如何编写测试以确保调用AddDbContext(...)和AddMvc(),通过Extensions方法实现所有这些功能的选择似乎使其无法测试?

CodeFuller:

好吧,是的,如果您想检查AddDbContext调用扩展方法的事实,services您将遇到麻烦。好消息是您实际上不应该检查这个事实。

Startup类是应用程序组合的根并且,在测试组合根时,您需要检查它是否实际注册了实例化根对象所需的所有依赖关系(对于ASP.NET Core应用程序为控制器)。

假设您有以下控制器:

public class TestController : Controller
{
    public TestController(ISomeDependency dependency)
    {
    }
}

您可以尝试检查是否Startup已注册的类型ISomeDependency但是实施ISomeDependency可能还需要检查其他一些依赖项。最终,您最终得到一个测试,该测试要对大量依赖项进行大量检查,但实际上并不能保证对象解析不会抛出缺少的依赖项异常。这样的测试没有太大的价值。

在测试合成根时,一种对我来说很好的方法是使用真实的依赖注入容器。然后,我在其上调用合成根,并断言不会抛出根对象的分辨率。

由于我们使用其他非存根类,因此不能将其视为纯单元测试。但是,与其他集成测试不同,此类测试快速且稳定。最重要的是,它们带来了有效检查的价值,用于正确的依赖项注册。如果这样的测试通过,则可以确定该对象也将在产品中正确实例化。

这是此类测试的示例:

[TestMethod]
public void ConfigureServices_RegistersDependenciesCorrectly()
{
    //  Arrange

    //  Setting up the stuff required for Configuration.GetConnectionString("DefaultConnection")
    Mock<IConfigurationSection> configurationSectionStub = new Mock<IConfigurationSection>();
    configurationSectionStub.Setup(x => x["DefaultConnection"]).Returns("TestConnectionString");
    Mock<Microsoft.Extensions.Configuration.IConfiguration> configurationStub = new Mock<Microsoft.Extensions.Configuration.IConfiguration>();
    configurationStub.Setup(x => x.GetSection("ConnectionStrings")).Returns(configurationSectionStub.Object);

    IServiceCollection services = new ServiceCollection();
    var target = new Startup(configurationStub.Object);

    //  Act

    target.ConfigureServices(services);
    //  Mimic internal asp.net core logic.
    services.AddTransient<TestController>();

    //  Assert

    var serviceProvider = services.BuildServiceProvider();

    var controller = serviceProvider.GetService<TestController>();
    Assert.IsNotNull(controller);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

.NET Core如何进行单元测试服务?

如何在 .NET Core 3.1 中对使用 ExecuteSqlRawAsync 调用存储过程的函数进行单元测试?

如何使用Moq对.NET Core 3.1中的LoggerMessage.Define()进行单元测试?

如何在 .Net Core 中对 ADF PipeLineRun 进行单元测试?

如何在ASP.NET Core中对ViewBag进行单元测试?

如何在ASP.NET Core MVC中对RazorViewEngineOptions进行单元测试?

如何对ASP.NET Core Web应用程序(.Net Framework)进行单元测试?

如何在 ASP.NET Core 中使用 mysql 进行单元测试、actionresult

如何在ASP.NET Core中使用ILogger进行单元测试

如何使用依赖注入.net Core 2进行单元测试

如何对返回匿名对象的ASP.NET Core MVC控制器进行单元测试?

如何在.Net中对Neo4j进行单元测试?

如何在ASP.NET Core 1.1中对使用HttpContext的MVC控制器进行单元测试

如何在ASP.NET Core中对Web API的动作过滤器属性进行单元测试?

如何对每个订阅的 Rx.Net 进行单元测试

使用Moq .net Core进行单元测试文件上传

如何在ASP.NET Core的X单元单元测试中模拟AutoMapper IConfigurationProvider

如何使用Xunit对ASP.net中的[System.Web.Http.Authorize]过滤器进行单元测试

如何使用ASP.NET 5(MVC 6)中的Response属性对控制器动作进行单元测试?

如何在Docker容器中运行.NET单元测试

在Asp.NET MVC中对ViewResult进行单元测试

如何对aspx.cs进行单元测试

如何在Visual Studio 2017 Mac中调试.NET Core /标准单元测试?

单元测试MiddleWare,如何在.NET Core 3.1中向HttpContext添加HttpRequest

如何检查ASP.NET Core 3.0的单元测试中是否记录了错误?

如何对包装在`runOnUiThread`中的代码进行单元测试?

如何对__init __()函数中调用的方法进行单元测试?

如何在Java中对ZipOutputStream进行单元测试

如何在 Angular 中对 NGXS 进行单元测试?