首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Moq作为存储库接口方法?

使用Moq作为存储库接口方法?
EN

Stack Overflow用户
提问于 2013-03-01 22:35:05
回答 2查看 491关注 0票数 1

我的存储库接口上有以下方法:

代码语言:javascript
运行
复制
IQueryable<T> GetQuery<T>(Expression<Func<T, bool>> predicate) where T : class;

我将在单元测试中使用以下构造函数执行一个类:

代码语言:javascript
运行
复制
public MyClass(IUnitOfWork unitOfWork)

IUnitOfWork接口上有一个公开的Repository属性:

代码语言:javascript
运行
复制
Repository Repository { get; }

因此,我试图像这样对MyClass.DoSomething()方法进行单元测试:

代码语言:javascript
运行
复制
[TestInitialize]
public void Setup()
{

    accounts = new List<Account>()
    {
        new Account()
            {
               Id = 123
            }
    };
}

接下来,我有一个单元测试Arrange部分,它失败了:

代码语言:javascript
运行
复制
//Arrange
var repositoryMock = new Mock<IUnitOfWork>();
repositoryMock.Setup(x => x.Repository.GetQuery<Account>(y => y.Id == 123))
                           .Returns(accounts.AsQueryable()); //This setup always fails
var myClass = new MyClass(repositoryMock.Object); //don't even get here

我得到的例外是:

System.NotSupportedException:在非虚拟(在VB中可覆盖)成员上的无效设置:x => x.Repository.GetQuery(y => y.Id == 123)

我在模拟中尝试了Setup的其他变体:

代码语言:javascript
运行
复制
repositoryMock.Setup(x => x.Repository.GetQuery<Account>()).Returns((Account a) => accounts.AsQueryable().Where(z => z.Id == 123));

代码语言:javascript
运行
复制
repositoryMock.Setup(x => x.Repository.GetQuery<Account>(y => y.Id == 123)).Returns((Account a) => accounts.AsQueryable().Where(z => z == a));

但没有成功,我每次都得到同样的例外。当我运行单元测试时,它们总是抛出相同的异常。既然我使用的是一个被嘲笑的接口,我为什么要得到这个异常,我如何正确地做到这一点?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-01 22:40:59

您所显示的Repository属性不是接口类型的。这是一些具体的课程。正如错误消息告诉您的那样,您不能定义对非虚拟方法的期望。因此,如果您想要模拟抽象,那么您应该做的是使用抽象:

代码语言:javascript
运行
复制
IRepository Repository { get; }
票数 1
EN

Stack Overflow用户

发布于 2013-03-01 22:41:07

不要使用当前的设置,请尝试如下:

代码语言:javascript
运行
复制
//Arrange
var repositoryMock = new Mock<IUnitOfWork>();
repositoryMock.Setup(x => x.Repository.GetQuery<Account>(
        It.IsAny<Expression<Func<T, bool>>>());
    .Returns(accounts.AsQueryable()); // This should not fail any more
var myClass = new MyClass(repositoryMock.Object); 

实际上,您不需要传递任何具体的lambda,因为您正在以任何方式返回您的列表。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15168001

复制
相关文章

相似问题

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