I'm integration testing my asp.net 5 web apis. In my test methods I want to get a reference to the instance a of faked service so I can customise the service's behaviour for my tests.
In the app, the service is scoped as singleton.
//in ConfigureServices in Startup.cs
services.AddSingleton<IYbNewProjectsService, YbNewProjectsService>();
In my test project, I set up my client and server in my TestFixture class, and save a reference to the ServiceProvider, returned to me by the services.BuildServiceProvider() call...
private void SetupClient()
{
Client = Factory.WithWebHostBuilder(builder =>
{
builder.ConfigureTestServices(services =>
{
services.Remove<IYbNewProjectsService>();
services.AddSingleton<IYbNewProjectsService, FakeYbNewProjetsService>();
});
builder.ConfigureServices(services =>
{
ServiceProvider = services.BuildServiceProvider();
});
})
.CreateClient(new WebApplicationFactoryClientOptions
{
AllowAutoRedirect = false
});
}
I know it's working, because in my tests, when I do...
// ServiceProvider is inherited from TestFixture, so it's the same as above.
var fakeYbService = (FakeYbNewProjectsService)ServiceProvider.GetService(typeof(IYbNewProjectsService));
fakeYbService.InjectedResponse = @"[{{""idProjet"":1883557,""dateDApplication"":...
var response = await Client.GetAsync("/api/yb-new-projects");
...I get my faked service. Trouble is, when I call Client.GetAsync(), the TestServer is using a clean instance of the same faked service, without my InjectedResponse. This is meant to be a singleton, so why are there two of them?