2017-09-17 1 views
1

J'ai une API, et j'essaie de faire des tests d'intégration avec XUnit. Voici mon API constructeur contrôleur:Comment puis-je utiliser IConfiguration à partir de mes tests d'intégration?

public class MyController : Controller 
{ 
    readonly IMyRepository _myRepository; 

    public MyController(IMyRepository myRepository) 
    { 
     _myRepository = myRepository; 
    } 

    public async Task<IActionResult> GetUser(Guid userId) 
    { 
     try 
     { 
      return Ok(await _my.GetUser(userId)); 
     } 
     catch (Exception ex) 
     { 
      return StatusCode(500, "An error occurred while handling your request."); 
     } 
    } 
} 

Mon contrôleur API utilise ce référentiel:

public class MyRepository : IMyRepository 
{ 
    private string _connectionString; 

    public MyRepository(IConfiguration config) 
    { 
     _connectionString = config.GetConnectionString("DefaultConnection"); 
    } 


    public async Task<User> GetUser(Guid userId) 
    { 
     using (SqlConnection con = new SqlConnection(connectionString)) 
     { 
      // call stored proc 
     } 
    } 
} 

Le référentiel utilise la chaîne de connexion pour ensuite faire quelques appels de base de données dans mes méthodes. Cela fonctionne lorsque j'appelle mes méthodes API depuis que la configuration a été configurée dans la classe Startup de mon application API.

Mais je ne suis pas sûr de savoir comment passer un objet de configuration avec la chaîne de connexion à mon dépôt de mes méthodes d'essai d'intégration:

public async Task GetUserShouldReturnOk() 
{ 
    var userId = new Guid(); 
    var configuration = // ???? 

    var controller = new MyController(
     new MyRepository(configuration)); 

    var result = await controller.GetUser(userId); 

    Assert.IsType<OkResult>(result); 
} 

J'ai essayé d'ajouter un paramètres JSON fichier à mon projet XUnit avec mes informations de chaîne de connexion, puis en essayant de le construire comme le fait ma classe de démarrage, mais j'obtiens une erreur car elle cherche le fichier json dans le répertoire \ bin \ Debug \ netcoreapp2.0 \ de mon projet de test, donc je ne suis pas sûr comment pointer le chemin de base au bon endroit soit:

var configuration = new ConfigurationBuilder() 
    .SetBasePath(Directory.GetCurrentDirectory()) 
    .AddJsonFile("appsettings.json") 
    .Build(); 

Existe-t-il un moyen approprié de le faire?

+0

Le référentiel sera-t-il connecté à une source de données réelle ou la source sera-t-elle raillée avec de fausses données? Se moquerait simplement de l'interface de configuration et l'injecterait dans la classe dépendante. Il n'y a pas assez d'informations pour fournir quelque chose de mieux que ce qui vient d'être suggéré. – Nkosi

+0

Pourriez-vous montrer comment la chaîne de connexion sera utilisée. Je crois qu'il peut y avoir des problèmes de conception avec l'implémentation actuelle du référentiel. – Nkosi

+0

@Nkosi - il se connecte à une source de données réelle. J'ai ajouté du code pour que vous puissiez voir comment la chaîne de connexion est utilisée dans le dépôt. – Steven

Répondre

1

Le fichier appsettings.json est juste dans mon test racine du projet, savez-vous un moyen facile d'obtenir le chemin du projet en cours pour que je n'ai pas à coder en dur qui valorisent

Définissez la propriété Build Action du fichier à Content il copie dans le répertoire de sortie de sorte qu'il est déplacé vers le bac lors du test et vous pouvez utiliser le code de configuration d'origine avec le .SetBasePath (Directory.GetCurrentDirectory())

public async Task GetUserShouldReturnOk() { 
    var userId = new Guid(); 
    var configuration = new ConfigurationBuilder() 
      .SetBasePath(Directory.GetCurrentDirectory()) 
      .AddJsonFile("appsettings.json") 
      .Build(); 

    var controller = new MyController(
     new MyRepository(configuration)); 

    var result = await controller.GetUser(userId); 

    Assert.IsType<OkResult>(result); 
} 
+0

Merci pour le répondez @Nkosi. Le fichier appsettings.json est juste dans la racine de mon projet de test. Connaissez-vous un moyen facile d'obtenir le chemin du projet actuel pour ne pas avoir à coder en dur cette valeur? – Steven

+1

@Steven, Eh bien, vous pouvez modifier les propriétés du fichier à copier dans le répertoire de sortie afin qu'il soit déplacé vers la poubelle lors du test et vous pouvez utiliser le code de configuration d'origine avec le '.SetBasePath (Directory.GetCurrentDirectory())' – Nkosi