이 문제를 어떻게 해결할 수 있는지 확실하지 않고 “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);
}
답변
모의 객체의 동작을 제어하려면 (최소한 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>();