Запуск Kestrel для тестирования без использования TestServer, включенного в Microsoft.AspNetCore.TestHost

Я использую SoapCore для создания приложения, похожего на WCF, используя asp.net core 2.

Это хорошо работает для меня, но я несколько столкнулся с кирпичной стеной, когда дело доходит до тестирования интеграции моих конечных точек.

Так как SoapCore является промежуточным программным обеспечением и не имеет отношения к каким-либо контроллерам API, я не могу использовать HttpClient для тестирования конечных точек, поэтому TestServer мне не нужен.

У меня вопрос: как мне запустить kestrel бок о бок с моим интеграционным тестом без использования TestServer, или есть ли способ использовать TestServer в этом случае?

Я не думаю, что какой-либо код здесь может быть полезен, но то, что я получил до сих пор, заключается в следующем.

Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IPaymentService>(service => new Services.PaymentService());
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseSoapEndpoint<IPaymentService>("/PaymentService.svc", new BasicHttpBinding());
        app.UseMvc();
    }
}

PaymentService

[ServiceContract]
public interface IPaymentService
{
    [OperationContract]
    string ReadPaymentFiles(string caller);
}

 public class PaymentService : IPaymentService
{
    public string ReadPaymentFiles(string caller)
    {
        return caller;
    }
}

Один из моих тестов:

public void Should_Get_Soap_Response_From_PaymentService()
    {
        var testServerFixture = new TestServerFixture();
        var binding = new BasicHttpBinding();
        var endpoint = new EndpointAddress(new Uri("http://localhost:5000/PaymentService.svc"));
        var channelFactory = new ChannelFactory<IPaymentService>(binding, endpoint);

        var serviceClient = channelFactory.CreateChannel();
        var response = serviceClient.ReadPaymentFiles("Ping");
        channelFactory.Close();
    }

Тест ничего не делает прямо сейчас, так как он не вызывает живой конечной точки, что является моей проблемой...

1 ответ

Решение

Вы можете использовать сам хостинг как Microsoft.AspNetCore.Hosting пакет. Перед выполнением теста вы можете запустить webHost, а затем вы выполняете свой текст над этим хостом.

public MyTestStartup()
{
    _webhost = WebHost.CreateDefaultBuilder(null)
                      .UseStartup<Startup>()
                      .UseKestrel()
                      .UseUrls(BASE_URL)
                      .Build();
    _webhost.Start();
}
Другие вопросы по тегам