web-dev-qa-db-ja.com

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

(少なくとも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>();
149
Tomas Aschan