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