Moq: Неверная настройка для не перезаписываемого элемента: x => x.GetByTitle ("asdf") - PullRequest
106 голосов
/ 26 декабря 2009

Не уверен, как это можно исправить, пытаясь выполнить юнит-тест по методу "GetByTitle"

Вот мои определения:

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

Запуск теста выдает ошибку:

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

Обновление

Мой [Setup] выглядит так:

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

     _articleManager = new ArticleManager(_mockDaoFactory.Object);    
}

1 Ответ

148 голосов
/ 26 декабря 2009

Чтобы управлять поведением фиктивного объекта (по крайней мере, в Moq), вам нужно либо имитировать интерфейс, либо убедиться, что поведение, которым вы пытаетесь управлять, помечено как виртуальное. В вашем комментарии я так понимаю, что создание экземпляра _mockArticleDao выполняется примерно так:

_mockArticleDao = new Mock<ArticleDAO>();

Если вы хотите сохранить это как есть, вам нужно отметить метод GetArticle virtual:

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

В противном случае (и это то, что я рекомендую), вместо этого смоделируйте интерфейс.

_mockArticleDao = new Mock<IArticleDAO>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...