Moq:在不可覆盖的成员上设置无效:x => x.GetByTitle(“asdf”)

不知道我怎么能解决这个问题,试图做一个unit testing的方法“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); } 

unit testing:

 [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); } 

运行testing给我的错误:

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

为了控制模拟对象的行为(至less在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>();