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

Я использую SoapCore для создания приложения WCF-типа, использующего ядро ​​asp.net 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 Ответ

0 голосов
/ 29 мая 2018

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

public MyTestStartup()
{
    _webhost = WebHost.CreateDefaultBuilder(null)
                      .UseStartup<Startup>()
                      .UseKestrel()
                      .UseUrls(BASE_URL)
                      .Build();
    _webhost.Start();
}
...