1

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

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

我有一个要在单元测试中使用以下构造函数的类:

public MyClass(IUnitOfWork unitOfWork)

IUnitOfWorkInterface 上有一个暴露的 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 => x.Repository.GetQuery(y => 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));

但没有成功;我每次都得到相同的异常。当我运行单元测试时,它们总是抛出相同的异常。由于我使用的是要模拟的接口,为什么会出现此异常以及如何正确执行此操作?谢谢!

4

2 回答 2

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,因为您正在以任何方式返回您的列表。

于 2013-03-01T22:41:07.587 回答
1

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

IRepository Repository { get; }
于 2013-03-01T22:40:59.187 回答