Je fais un projet unittesting pour tester mon webapi et j'ai besoin d'initialiser un contrôleur le problème est que dans le constructeur, il reçoit une IConfiguration qu'il fournit par injection de dépendance et fonctionne correctement.
Mais quand je veux l'initialiser manuellement, je n'ai aucun moyen d'obtenir cette instance.
J'essaie de l'initialiser à partir d'un projet le plus simple, pas à l'intérieur du même projet.
Le contrôleur ressemble à:
public Controller(IConfiguration configuration) { _configuration = configuration; }
Je devrais probablement partir de la déclaration selon laquelle dans l'application .Net Core, vous ne devriez pas passer d'instance de IConfiguration
à vos contrôleurs ou à d'autres classes. Vous devez utiliser des paramètres fortement typés injectés via IOptions<T>
. Voir cet article pour plus de détails: modèle d'options dans ASP.NET Core .
Lorsque vous utilisez le modèle d'options, vous aurez POCO pour les paramètres requis par un contrôleur. Cet objet de paramètres est ensuite injecté dans le contrôleur enveloppé dans IOptions<T>
:
public class ControllerSettings
{
public string Setting1 { get; set; }
public int Setting2 { get; set; }
// ...
}
public class Controller
{
private readonly ControllerSettings _settings;
public Controller(IOptions<ControllerSettings> options)
{
_settings = options.Value;
}
}
Ensuite, il est assez simple de passer les paramètres souhaités à partir d'un test unitaire. Remplissez simplement l'instance de paramètres et encapsulez vers IOptions<T>
avec l'un des cadres de simulation disponibles, comme Moq ou NSubstitute :
[TestMethod]
public void SomeTest()
{
var settings = new ControllerSettings
{
Setting1 = "Some Value",
Setting2 = 123,
};
var options = new Mock<IOptions<ControllerSettings>>();
options.Setup(x => x.Value).Returns(settings);
var controller = new Controller(options.Object);
// ...
}
Parfois, il est nécessaire d'utiliser une configuration réelle du projet, par exemple lors du développement d'un test d'intégration. Dans ce cas, vous pouvez créer une instance de ConfigurationBuilder
et la remplir avec les mêmes sources de configuration que dans le code testé:
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
// Duplicate here any configuration sources you use.
configurationBuilder.AddJsonFile("AppSettings.json");
IConfiguration configuration = configurationBuilder.Build();