wake-up-neo.net

Moq: Ungültiges Setup für ein nicht überschreibbares Mitglied: x => x.GetByTitle ("asdf")

Ich bin mir nicht sicher, wie ich das beheben kann, wenn ich versuche, einen Komponententest mit der Methode "GetByTitle" durchzuführen.

Hier sind meine Definitionen:

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

gerätetest:

[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);
}

Das Ausführen des Tests gibt mir den Fehler:

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

Aktualisieren

Mein [Setup] sieht aus wie:

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

     _articleManager = new ArticleManager(_mockDaoFactory.Object);    
}
107
mrblah

Um das Verhalten eines Scheinobjekts zu steuern (zumindest in Moq), müssen Sie entweder eine Schnittstelle verspotten oder sicherstellen, dass das Verhalten, das Sie steuern möchten, als virtuell markiert ist. In Ihrem Kommentar verstehe ich es so, dass die Instanziierung von _mockArticleDao wird ungefähr so ​​gemacht:

_mockArticleDao = new Mock<ArticleDAO>();

Wenn Sie dies beibehalten möchten, müssen Sie die GetArticle -Methode virtual markieren:

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

Ansonsten (und das empfehle ich) verspotten Sie stattdessen die Benutzeroberfläche.

_mockArticleDao = new Mock<IArticleDAO>();
149
Tomas Aschan