我正在使用 .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 合约测试可以使用它?
使用 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.