首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Moq:对非覆盖成员的无效设置:X=>x.GetByTitle(“asdf”)

Moq:对非覆盖成员的无效设置:X=>x.GetByTitle(“asdf”)
EN

Stack Overflow用户
提问于 2018-03-22 00:28:18
回答 1查看 0关注 0票数 0

不知道如何修复这个问题,我试图对方法“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);    
}
EN

Stack Overflow用户

发布于 2018-03-22 09:38:06

为了控制模拟对象的行为(至少在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>();
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档