J'ai étudié l'utilisation d'objets factices dans les tests unitaires et essayé le framework Moq pour .NET. Je rencontre des problèmes lors de la tentative de test d'une méthode de couche de service qui renvoie un objet de domaine à partir d'une base de données.Problème lors de l'utilisation de Moq dans les tests unitaires
Voici ma configuration:
[SetUp]
public void DoSetupTasks()
{
mockDao = new Mock<IHibernateDao>();
_hibernateService = new HibernateService(mockDao.Object);
mockDomainObject = new Mock<DomainBase>();
dmBase = new DomainBase()
{
Id = 5
};
}
Voici le test unitaire je rencontre des problèmes avec. La méthode FindById()
renvoie un objet DomainBase basé sur un ID et un type donnés.
[Test]
public void TestFindById()
{
mockDomainObject.Setup(dmb => dmb.Id.Equals(It.IsAny<long>())).Returns(true);
mockDao.Setup(dao => dao.FindById(
It.IsAny<long>(),
It.IsAny<Type>()
)).Returns(mockDomainObject.Object);
_hibernateService.FindById(dmb.Id, typeof(DomainBase));
mockDomainObject.VerifySet(dmb => dmb.Id = dmBase.Id);
}
Quand je lance le test unitaire, il jette l'exception suivante:
Exception: Invalid setup on a non-virtual (overridable in VB) member: dmb => dmb.Id.Equals(It.IsAny<Int64>())
Je l'avoue, je suis assez familier avec le cadre. J'ai essayé de suivre quelques tutoriels, mais je n'ai pas réussi à le comprendre.
Merci! Je vais essayer d'en faire un compte-rendu demain, mais si je me fie uniquement à votre code, c'est beaucoup plus logique maintenant. –
Votre exemple a bien fonctionné. Merci encore, Dylan. Une autre question: comment pourriez-vous écrire un test qui vérifierait la persistance d'un objet de domaine dans une base de données ou la suppression d'un objet? –
Voir édition. C'est un peu le même principe mais en sens inverse - vous créez votre objet domaine, passez le dans la méthode de service, puis vérifiez dans votre simulation (via un rappel) que la couche de service passe les bons objets aux bonnes méthodes sur votre DAO. –