Не знаю, как это исправить, пытаюсь выполнить модульный тест метода 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);
}
_mockDaoFactory
и_mockArticleDao
где-нибудь? Вы издеваетесь над классом или интерфейсом?GetByTitle
методvirtual
.Ответы:
Чтобы контролировать поведение фиктивного объекта (по крайней мере, в Moq), вам нужно либо имитировать интерфейс, либо убедиться, что поведение, которым вы пытаетесь управлять, помечено как виртуальное. В вашем комментарии я понимаю, что создание экземпляра
_mockArticleDao
выполняется примерно так:Если вы хотите сохранить его таким, вам нужно отметить
GetArticle
методvirtual
:В противном случае (и это то, что я рекомендую) вместо этого имитируйте интерфейс.
источник