Je suis ce guide . J'ai un Startup
dans le projet d'API qui utilise un fichier de configuration appsettings.json
.
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
}
La partie que je regarde est le env.ContentRootPath
. J'ai fait quelques recherches et il semble que mon appsettings.json
ne soit pas copié dans le dossier bin
, mais c'est correct, car ContentRootPath
renvoie MySolution\src\MyProject.Api\
, où se trouve le fichier appsettings.json
.
Donc, dans mon projet de test d'intégration, j'ai ce test:
public class TestShould
{
private readonly TestServer _server;
private readonly HttpClient _client;
public TestShould()
{
_server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
_client = _server.CreateClient();
}
[Fact]
public async Task ReturnSuccessful()
{
var response = await _client.GetAsync("/monitoring/test");
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
Assert.Equal("Successful", responseString);
}
Ceci est essentiellement copier et coller à partir du guide. Lorsque je débogue ce test, ContentRootPath
est en fait MySolution\src\MyProject.IntegrationTests\bin\Debug\net461\
, qui est évidemment le dossier de sortie du projet de test et encore une fois, le fichier appsettings.json
n’est pas là (oui, j’ai un autre fichier appsettings.json
dans le projet de test lui-même). Le test échoue lors de la création. la TestServer
.
J'ai essayé de contourner ce problème en modifiant le fichier test project.json
.
"buildOptions": {
"emitEntryPoint": true,
"copyToOutput": {
"includeFiles": [
"appsettings.json"
]
}
}
J'espérais que cela copierait le fichier appsettings.json
dans le répertoire de sortie de la construction, mais il se plaignait du manque d'une méthode Main
dans le projet, ce qui traitait le projet de test comme un projet de console.
Que puis-je faire pour contourner cela? Est-ce que je fais quelque chose de mal?
Finalement, j'ai suivi ce guide , en particulier la section Integration Testing vers le bas de la page. Cela évite de copier le fichier appsettings.json
dans le répertoire de sortie. Au lieu de cela, il indique au projet de test le répertoire réel de l'application Web.
En ce qui concerne la copie du appsettings.json
dans le répertoire de sortie, j’ai également réussi à le faire fonctionner. Combinée à la réponse de (dudu} _, j'ai utilisé include
au lieu de includeFiles
pour que la section résultante ressemble à ceci:
"buildOptions": {
"copyToOutput": {
"include": "appsettings.json"
}
}
Je ne suis pas tout à fait sûr de savoir pourquoi cela fonctionne, mais ça marche. J'ai jeté un coup d'œil à la documentation, mais je n'ai pas trouvé de réelle différence. Puisque le problème initial était essentiellement résolu, je n'ai pas cherché plus loin.
Test d'intégration sur ASP.NET.Core 2.0 suivez MS Guide ,
Vous devez cliquer avec le bouton droit sur appsettings.json
et définir sa propriété Copy to Output directory
sur Copier toujours
Et maintenant, vous pouvez trouver le fichier JSON dans le dossier de sortie et construire TestServer
avec
var projectDir = System.IO.Directory.GetCurrentDirectory();
_server = new TestServer(new WebHostBuilder()
.UseEnvironment("Development")
.UseContentRoot(projectDir)
.UseConfiguration(new ConfigurationBuilder()
.SetBasePath(projectDir)
.AddJsonFile("appsettings.json")
.Build()
)
.UseStartup<TestStartup>());
Supprimez "emitEntryPoint": true
dans le fichier test project.json
.