Le test d'un service à l'aide de maquette d'objets de référentiel
Je suis en train de tester un service à l'intérieur d'un cadre.
Afin d'initialiser le service, je suis en utilisant la maquette des objets du référentiel.
ServiceTest.cs
private IRepository _repository;
private IService _service;
private List<Object> _objects;
[TestInitialize]
public void Initialize()
{
_repository = new Mock<IRepository>().Object;
_service = new Service(repository);
_objects = new List<Object>()
{
new Object { Name = "random", ID = 1 },
new Object { Name = "not so random", ID = 1},
new Object { Name = "random", ID = 2 },
new Object { Name = "not so random", ID = 2}
};
//attempt at mocking the repository
_repository.Setup(r => r.GetObjects(It.IsAny<string>(), It.IsAny<int>())).Returns(_objects.Where(o => o.Name == _objects.Name && o.ID == _objects.ID).ToList());
}
[TestMethod]
public void GetObjects_ReturnObjectsList()
{
//Arrange
var name = "random";
//Act
var objects = _service.RetrieveObjects(name, 2);
//Assert
Assert.AreEqual(name, objects.Single().Name);
}
Cependant, quand j'ai tester le service, je reçois ArgumentNullExceptions
. Les variables définies dans le référentiel des appels à la méthode de retour null
, et, finalement, déclenche une erreur lors de la logique métier est exécuté.
Service.cs
public List<Objects> RetrieveObjects(string name, int id)
{
var getObjects = repository.GetObjects(name, id); //getObjects return null
DoLogic(getObjects); //ArgumentNullException is thrown here
return getObjects;
}
J'ai cherché des informations sur les moqueries des dépôts, mais il semble que je vais avoir beaucoup de choses à l'installation, juste pour tester. Je me demande si le programme d'installation est en vaut la peine.
Pourquoi suis-je ArgumentNullExceptions
? Est-il un moyen de tester des méthodes qui appellent des référentiels?
- Qu'essayez-vous de test? De Service ou de Référentiel? Vous êtes moqueur Référentiel, et de l'affirmation de quoi il en retourne?!
- Oups, je voulais dire de service.
Vous devez vous connecter pour publier un commentaire.
Vous avez juste besoin d'Installation de ce qui est testé, donc dans votre arranger faire quelque chose comme:
repository
variable est définie surIRepository
objet, plutôt que de var.new Mock<Repository>()
ne fonctionne pas avecIRepository
..cs
fichier en tout? J'ai de l'installation d'un simulacre de référentiel et je suis encore arrivernull
. Veuillez voir le jour..cs
fichier en tout? J'ai de l'installation d'un simulacre de référentiel et je suis encore arrivernull
. Veuillez voir le jour.getObjects
est passé dans DoLogic, il estnull
. C'était le cas avant le fait. Aucun progrès n'a jusqu'à présent à cet égard. Les classes de dépôt ont été unité-testé à fond et suis en train de tester les services dans le cadre.Vous devez tester votre SUT (objet sous test) dans l'isolement. N'essayez pas de se moquer de classes existantes, l'utilisation des interfaces uniquement. De cette façon, vous n'aurez pas à compter sur d'autres objets, qui pourrait éventuellement être buggy. Souvent, vous ne serez pas en mesure de configurer des rappels et des retours de classes existantes utilisées comme des simulacres. Se moquant d'interfaces vous permet de contrôler et de prévoir les valeurs de retour.
Donc, dans votre cas particulier, vous devez faire comme @ianaldo21 proposé, je venais de changer de première ligne:
et puis faire l'installation, et de passer le référentiel.Objet de Service.
Au lieu de l'affirmation de l'état de la CUS, vous devriez tester le comportement et les interactions des SUT avec d'autres objets. Vous pouvez donc avoir quelque chose comme ceci:
De cette façon, vous avez souvent besoin de beaucoup moins de mise en place pour les tests.