debugging 如何集成测试附加到Visual Studio调试器的控制台应用程序

6ljaweal  于 2023-01-09  发布在  其他
关注(0)|答案(2)|浏览(143)

我正在制作一个控制台应用程序,我想使用WebApplicationFactory<>为ASP.NET核心应用程序创建我习惯的集成/组件测试。
但是,我一直无法找到一种方法来以附加方式测试控制台应用程序,以确保我可以在调试测试期间在控制台应用程序中设置断点。
我试着用下面的答案来破解一些东西,但是我没有达到断点。当它试图连接的时候,进程已经终止了。
https://stackoverflow.com/a/72075450
有没有更好的方法让我忽略?
我当前代码的简化版本:

internal class Program
{
    static async Task Main(string[] args)
    {
        var host = Host.CreateDefaultBuilder(args)
            .UseConsoleLifetime()
            .ConfigureServices((_, services) => services.AddHostedService<CustomHostedService>())
            .Build();

        await host.RunAsync();
    }
}
internal class CustomHostedService : IHostedService
{
    private readonly IHostApplicationLifetime _hostApplicationLifetime;

    public CustomHostedService(IHostApplicationLifetime hostApplicationLifetime)
    {
        _hostApplicationLifetime = hostApplicationLifetime;
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        // Actual code for the application

        _hostApplicationLifetime.StopApplication();
    }

    public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}
internal class IntegrationTests
{
    [Fact]
    public void Executable()
    {
        Process.Start("{assemblyName}.exe {arguments}")
        
        // Asserts
    }

    [Fact]
    public void DotnetRun()
    {
        Process.Start("dotnet", "run --project {project_path} {arguments}");

        // Asserts
    }
}
wvyml7n5

wvyml7n51#

如果它是一个控制台应用程序,请使用AutoHotKey或SikuliX for wimforms或其他系统作为测试框架运行它。
Selenium在测试网站方面很流行,但是console和winform完全不同,它们不是为WebApplicationFactory<>模式设计的。
你也许能够做到这一点,虽然有一个原因,你无法找到其他人的例子走上这条不匹配的技术道路,因为它是非正统的和不受支持的。
我会尝试AHK和SikuliX,两者都是免费的,并考虑附加调试器的进程-这通常是有用的故障排除系统的问题,无法重现。当你只是运行一个控制台应用程序与一堆逻辑代码路径,你可以很容易地通过阅读StdOut的各种序列的输入验证。

jum4pzuy

jum4pzuy2#

我建议你不要把事情复杂化,你需要在处理多个项目时添加附件,因为这是一个项目,你可以按照下面提到的常规测试用例的东西。https://learn.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/unit-testing/creating-unit-tests-for-asp-net-mvc-applications-cs

[TestClass]
 public class ProductControllerTest
 {
      [TestMethod]
      public void TestDetailsView()
      {
           var controller = new ProductController();
           var result = controller.Details(2) as ViewResult;
           Assert.AreEqual("Details", result.ViewName);

      }
 }

测试方法的常规调试会将您带到要调试的方法。

相关问题