Запуск 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();
}