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

时间:2013-03-01 22:35:06

标签: c# moq

我的存储库界面上有以下方法:

IQueryable<T> GetQuery<T>(Expression<Func<T, bool>> predicate) where T : class;

我有一个课程,我将使用以下构造函数进行单元测试:

public MyClass(IUnitOfWork unitOfWork)

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

Repository Repository { get; }

所以我试图对MyClass.DoSomething()方法进行单元测试,如下所示:

[TestInitialize]
public void Setup()
{

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

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

//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 =&gt; x.Repository.GetQuery(y =&gt;   y.Id == 123)

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

repositoryMock.Setup(x => x.Repository.GetQuery<Account>()).Returns((Account a) => accounts.AsQueryable().Where(z => z.Id == 123));

repositoryMock.Setup(x => x.Repository.GetQuery<Account>(y => y.Id == 123)).Returns((Account a) => accounts.AsQueryable().Where(z => z == a));

但没有成功;我每次都得到相同的例外。当我运行单元测试时,它们总是抛出相同的异常。由于我使用的是一个被模拟的接口,为什么我会得到这个异常,我该怎么做呢?谢谢!

2 个答案:

答案 0 :(得分:2)

请尝试以下方法,而不是当前的设置:

//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,因为你以任何一种方式返回列表。

答案 1 :(得分:1)

您显示的Repository属性不是接口类型。这是一些具体的课程。正如错误消息告诉您的那样,您无法定义非虚拟方法的期望。所以你要做的就是使用抽象,如果你想要能够嘲笑它:

IRepository Repository { get; }