不确定如何解决此问题,尝试对方法“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中如此),您需要模拟一个接口(interface),或者确保您尝试控制的行为被标记为虚拟。在您的评论中,我理解它,以便对_mockArticleDao进行实例化是这样的:

_mockArticleDao = new Mock<ArticleDAO>();

如果要保持原样,则需要标记GetArticle方法virtual:
public class ArticleDAO :  GenericNHibernateDAO(IArticle, int>, IArticleDAO
{
    public virtual IArticle GetByTitle(string title)
    {
        // ...
    }
}

否则(这是我的建议),而是模拟接口(interface)。
_mockArticleDao = new Mock<IArticleDAO>();

关于c# - Moq:在不可覆盖的成员上的无效设置:x => x.GetByTitle (“asdf”),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1962010/

10-11 01:04