web-dev-qa-db-fra.com

Moq: Configuration non valide sur un membre non remplaçable: x => x.GetByTitle ("asdf")

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);    
}
107
mrblah

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 GetArticlevirtual:

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>();
149
Tomas Aschan