Je ne sais pas comment résoudre ce problème, en essayant de faire un test unitaire sur la méthode "GetByTitle"
Voici mes définitions:
public class ArticleDAO : GenericNHibernateDAO(IArticle, int>, IArticleDAO
{
public IArticle GetByTitle(string title)
{
IQuery query = Session.CreateQuery("...")
return query.UniqueResult<IArticle>();
}
}
public interface IArticleDAO
{
IArticle GetByTitle(string title);
}
test de l'unité:
[Test]
public void can_load_by_title()
{
_mockDaoFactory.Setup(x => x.GetArticleDao())
.Returns(_mockArticleDao.Object);
_mockArticleDao.Setup(x => x.GetByTitle("some title"))
.Returns(article1.Object);
_articleManager.LoadArticle("some title");
Assert.IsNotNull(_articleManager.Article);
}
L'exécution du test me donne l'erreur suivante:
System.ArgumentException: Invalid setup on a non-overridable member:
x => x.GetByTitle("some title")
Mise à jour
Ma [Setup]
ressemble à:
[Setup]
public void SetUp()
{
_mockDaoFactory = new Mock<IDaoFactory>();
_mockArticleDao = new Mock<ArticleDao>();
_articleManager = new ArticleManager(_mockDaoFactory.Object);
}
Afin de contrôler le comportement d'un objet fictif (dans Moq, au moins), vous devez simuler une interface ou vous assurer que le comportement que vous tentez de contrôler est marqué comme virtuel. Dans votre commentaire, je le comprends pour que l'instanciation de _mockArticleDao
est fait quelque chose comme ceci:
_mockArticleDao = new Mock<ArticleDAO>();
Si vous voulez le conserver ainsi, vous devez marquer la méthode GetArticle
virtual
:
public class ArticleDAO : GenericNHibernateDAO(IArticle, int>, IArticleDAO
{
public virtual IArticle GetByTitle(string title)
{
// ...
}
}
Sinon (et c'est ce que je recommande), se moque de l'interface à la place.
_mockArticleDao = new Mock<IArticleDAO>();