115 votes

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:

 System.ArgumentException: Invalid setup on a non-overridable member:
x => x.GetByTitle("some title")
 

Mettre à jour

Mon [Setup] ressemble à:

 [Setup]
public void SetUp()
{
     _mockDaoFactory = new Mock<IDaoFactory>();
     _mockArticleDao = new Mock<ArticleDao>();

     _articleManager = new ArticleManager(_mockDaoFactory.Object);    
}
 

159voto

Tomas Lycken Points 23432

Afin de contrôler le comportement d'un objet fantaisie (Moq, au moins), vous devez simuler une interface, ou assurez-vous que le comportement que vous essayez de contrôle est marqué virtuel. Dans votre commentaire, je comprends donc que l'instanciation d' _mockArticleDao est en fait quelque chose comme ceci:

_mockArticleDao = new Mock<ArticleDAO>();

Si vous voulez le garder ainsi, vous devez marquer l' GetArticle méthode virtual:

public class ArticleDAO :  GenericNHibernateDAO(IArticle, int>, IArticleDAO
{
    public virtual IArticle GetByTitle(string title)
    {
        // ...
    }
}

Sinon (et c'est ce que je recommande), se moquent de l'interface à la place.

_mockArticleDao = new Mock<IArticleDAO>();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X