如何在单独的测试项目(用于契约测试)中启动/初始化 .Net Core 最小 API?

问题描述 投票:0回答:1

我正在使用 .Net Core 7 进行 Pact-Net (Pact.io) 概念验证。我让消费者端正常工作,拨打电话并生成协议文件。我的问题是 .Net core 7 提供程序(API)方面。我创建了一个独立的最小 API,当我自行启动它时它可以正常工作。

但是,问题是我需要能够将 API 作为单独的测试项目的一部分进行初始化,以便测试可以针对 API 运行 pact 文件。

我的 API 代码看起来像这样...

public static void Main(string[] args)
{
    ProviderStartup.Start();
}

public static class ProviderStartup
{
    public static void Start()
    {
        var repository = ProductRepository.GetInstance();

        var builder = WebApplication.CreateBuilder();
        var webApp = builder.Build();

        webApp.MapGet("/products", () => repository.GetProducts());
        webApp.MapGet("/product/{id}", (string id) => repository.GetProduct(id));

        webApp.Run();
    }
}

但是,如何从测试项目启动 api 的所有示例看起来都与下面的类似,但我无法使其工作...

private string _providerUri { get; }
private string _pactServiceUri { get; }
private IWebHost _webHost { get; }
private ITestOutputHelper _outputHelper { get; }

public ProviderApiTests(ITestOutputHelper output)
{
    _outputHelper = output;
    _providerUri = "http://localhost:7008";
    _pactServiceUri = "http://localhost:9001";

    _webHost = WebHost.CreateDefaultBuilder()
        .UseUrls(_pactServiceUri)
        .UseStartup<Startup>()
        .Build();

    _webHost.Start();
}

有谁知道如何从测试项目中启动 API 项目,以便 Pact 合约测试可以使用它?

asp.net-core .net-core asp.net-core-webapi pact
1个回答
0
投票

使用 TestServer 或任何应用程序构建器似乎效果不太好。然而,使用 Process 启动 API 效果非常好。

// Test constructor
public ProviderApiTests(ITestOutputHelper output)
{
    _outputHelper = output;
    _providerUri = "http://localhost:5000";

    var startInfo = new ProcessStartInfo();
    startInfo.FileName = "Provider.exe";
    _process = Process.Start(startInfo);
}

NOTE: In your TearDown or Dispose, make sure you add a Process.Kill() call to stop the API. 
© www.soinside.com 2019 - 2024. All rights reserved.