Il seguente codice funziona come previsto, ed è molto simile ai campioni presenti sul sito asp:.net nucleo RC2 non funziona
public abstract class BaseResourceTests : IDisposable
{
private readonly TestServer _server;
public HttpClient HttpClient { get; }
protected BaseResourceTests(string resourceVersion)
{
var hostBulider = new WebHostBuilder()
.UseStartup<Startup>();
_server = new TestServer(hostBulider);
HttpClient = _server.CreateClient();
HttpClient.BaseAddress = new Uri("http://localhost:5000");
}
public virtual void Dispose()
{
HttpClient.Dispose();
_server.Dispose();
}
}
public class EndpointTests : BaseResourceTests
{
public EndpointTests()
: base(Resource.VersionHeader)
{
}
[Fact]
public async Task Post_BodyHasValidDto_ReturnsCreated()
{
var dto = new Dto { Name = "someDto" };
var response = await HttpClient.PostAsJsonAsync("/api/someEndpoint", dto);
Check.That(response.StatusCode).IsEqualTo(HttpStatusCode.Created);
}
}
Il mio test funziona bene raggiunge l'azione nella controller bene. Tuttavia nella vita reale i test sono un po 'più complicati, ho bisogno di aggiungere alcuni servizi e configurazioni di test personalizzate.
Per fare questo creo un TestStartup che eredita dal mio originale classe progetto di avvio:
public class TestStartup : Startup
{
public TestStartup(IHostingEnvironment env) : base(env)
{
}
public override void ConfigureServices(IServiceCollection services)
{
base.ConfigureServices(services);
}
public override void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
base.Configure(app, env, loggerFactory);
}
}
Come si può vedere solo i delegati al classe base, in modo da ora a cambiare il costruttore di utilizzare il mio Codice TestStartup:
protected BaseResourceTests(string resourceVersion)
{
var hostBulider = new WebHostBuilder()
.UseStartup<TestStartup>();
_server = new TestServer(hostBulider);
HttpClient = _server.CreateClient();
HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(resourceVersion));
HttpClient.BaseAddress = new Uri("http://localhost:5000");
}
E i test ora non riescono con l'eccezione NotFound Http. Quando si esegue il debug, risulta che l'azione nel controller non viene più colpita dal codice di test.
La mia ipotesi è che in qualche modo mvc non rileva i percorsi se il file di avvio è un assembly diverso dai controller, come posso aggirare questo?
provare a cambiare '_server = new TestServer (hostBulider);' a _server = TestServer.CreateBuilder(). UseStartup(); –
Set
Non esiste un metodo statico CreateBuilder sulla classe TestServer, penso che fosse in rc1 – Calin