mrb*_*lah 108 c# nhibernate resharper nunit moq
不知道如何解决这个问题,尝试对方法"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);
}
Run Code Online (Sandbox Code Playgroud)
单元测试:
[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);
}
Run Code Online (Sandbox Code Playgroud)
运行测试给出了错误:
System.ArgumentException: Invalid setup on a non-overridable member:
x => x.GetByTitle("some title")
Run Code Online (Sandbox Code Playgroud)
更新
我[Setup]看起来像:
[Setup]
public void SetUp()
{
_mockDaoFactory = new Mock<IDaoFactory>();
_mockArticleDao = new Mock<ArticleDao>();
_articleManager = new ArticleManager(_mockDaoFactory.Object);
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*han 150
为了控制模拟对象的行为(至少在Moq中),您需要模拟一个接口,或者确保您尝试控制的行为标记为虚拟.在你的评论中,我理解它,以便实例化_mockArticleDao是这样的:
_mockArticleDao = new Mock<ArticleDAO>();
Run Code Online (Sandbox Code Playgroud)
如果要保持原样,则需要标记GetArticle方法virtual:
public class ArticleDAO : GenericNHibernateDAO(IArticle, int>, IArticleDAO
{
public virtual IArticle GetByTitle(string title)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
否则(这是我推荐的),改为模拟界面.
_mockArticleDao = new Mock<IArticleDAO>();
Run Code Online (Sandbox Code Playgroud)