[c#] Moq : 재정의 할 수없는 구성원에 대한 잘못된 설정 : x => x.GetByTitle ( “asdf”)

이 문제를 어떻게 해결할 수 있는지 확실하지 않고 “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>();


답변