.Net, Base de Tests Unitaires - Maquette IOptions<T>
J'ai l'impression que je suis absent quelque chose de vraiment évident ici. J'ai des cours qui nécessitent l'injection d'options à l'aide de l' .Net de Base IOptions modèle(?). Quand je vais à l'unité de test de la classe que je veux pour se moquer de différentes versions ofo les options à valider le fonctionnement de la classe. Personne ne sait comment correctement maquette/instancier/remplir IOptions à l'extérieur du Démarrage de la classe?
Voici quelques exemples de classes, je travaille avec:
Paramètres/Options De Modèle
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace OptionsSample.Models
{
public class SampleOptions
{
public string FirstSetting { get; set; }
public int SecondSetting { get; set; }
}
}
Classe à tester qui utilise les Paramètres:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using OptionsSample.Models
using System.Net.Http;
using Microsoft.Extensions.Options;
using System.IO;
using Microsoft.AspNetCore.Http;
using System.Xml.Linq;
using Newtonsoft.Json;
using System.Dynamic;
using Microsoft.Extensions.Logging;
namespace OptionsSample.Repositories
{
public class SampleRepo : ISampleRepo
{
private SampleOptions _options;
private ILogger<AzureStorageQueuePassthru> _logger;
public SampleRepo(IOptions<SampleOptions> options)
{
_options = options.Value;
}
public async Task Get()
{
}
}
}
De test de l'unité dans un montage différent des autres classes:
using OptionsSample.Repositories;
using OptionsSample.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Xunit;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
namespace OptionsSample.Repositories.Tests
{
public class SampleRepoTests
{
private IOptions<SampleOptions> _options;
private SampleRepo _sampleRepo;
public SampleRepoTests()
{
//Not sure how to populate IOptions<SampleOptions> here
_options = options;
_sampleRepo = new SampleRepo(_options);
}
}
}
- Pourriez-vous donner un petit exemple de code du bloc que vous essayez de se moquer? merci!
- Êtes-vous confus au sens de la moquerie? Vous vous moquez sur une interface et de le configurer pour revenir à une valeur spécifiée. Pour
IOptions<T>
vous n'avez qu'à se moquer deValue
pour retourner la classe que vous désir
Vous devez vous connecter pour publier un commentaire.
Vous devez créer manuellement et remplir un
IOptions<SampleOptions>
objet. Vous pouvez le faire via leMicrosoft.Extensions.Options.Options
classe d'aide. Par exemple:Vous pouvez simplifier un peu:
Évidemment, ce n'est pas très utile comme est. Vous aurez besoin pour créer et remplir une SampleOptions objet et le passer dans la méthode Create.
Si vous avez l'intention d'utiliser les Moqueries Cadre comme indiqué par @TSeng, dans le commentaire, vous devez ajouter la dépendance suivant dans votre projet.fichier json.
Une fois que la dépendance est restauré à l'aide de l'MOQ cadre est aussi simple que de créer une instance de la SampleOptions classe et puis comme c'est dit de l'affecter à la Valeur.
Voici un code décrire comment il devrait ressembler.
Une fois la maquette est de l'installation, vous pouvez maintenant passer à l'objet fantaisie pour le constructeur que
HTH.
Pour info j'ai un dépôt git qui décrit ces 2 approches sur Github/patvin80
Vous pouvez éviter d'utiliser MOQ à tous.
À utiliser dans vos tests .json fichier de configuration. Un fichier pour de nombreux test des fichiers de classe. Il sera parfait pour utiliser
ConfigurationBuilder
dans ce cas.Exemple de appsetting.json
Exemple de paramètres de mappage de classe:
Exemple de service qui est nécessaire pour tester:
NUnit de la classe de test:
Classe donnée
Person
qui dépend de laPersonSettings
comme suit:IOptions<PersonSettings>
peut se moque de lui etPerson
peut être vérifiée comme suit:À injecter
IOptions<PersonSettings>
enPerson
au lieu de passer explicitement à la ctor, utilisez ce code:Voici un autre moyen facile qui n'a pas besoin de s'en Moquer, mais utilise à la place de la OptionsWrapper:
Pour mon système et des tests d'intégration, je préfère avoir un copier/lien de mon fichier de config à l'intérieur du projet de test. Puis-je utiliser le ConfigurationBuilder pour accéder aux options.
De cette façon, je peux utiliser la config partout à l'intérieur de mon projet d'essai. Pour les tests unitaires, je préfère utiliser MOQ comme patvin80 décrit.
D'accord avec Aleha que l'utilisation d'un testSettings.json fichier de configuration est probablement mieux.
Et puis, au lieu de l'injection de la IOption vous pouvez simplement injecter le réel SampleOptions dans votre constructeur de la classe, lorsque l'appareil de test de la classe, vous pouvez effectuer les opérations suivantes dans un dispositif d'éclairage ou encore tout simplement dans la classe de test constructeur:
Vous pouvez toujours créer vos options via les Options.Create() et que de simplement utiliser AutoMocker.Utilisation(options) avant la création de l'instance factices du dépôt que vous effectuez le test. À L'Aide De AutoMocker.CreateInstance<>() rend plus facile à créer des instances manuellement sans passer des paramètres
J'ai changé vous êtes SampleRepo un peu afin d'être en mesure de reproduire le problème, je pense que vous voulez atteindre.