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