使用Moq作为存储库接口方法
本文关键字:接口 方法 存储 Moq 使用 | 更新日期: 2023-09-27 18:01:43
在我的存储库接口上有以下方法:
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
我得到的例外是:
系统。NotSupportedException:在非虚拟上设置无效(可在VB中重写)member: 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));
但没有成功;每次都得到相同的异常。当我运行单元测试时,它们总是抛出相同的异常。因为我正在使用一个接口被嘲笑,为什么我得到这个异常,我如何正确地做到这一点?谢谢!
不要使用当前的设置:
//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,因为您将以任何方式返回列表。
您所显示的Repository属性不是接口类型。它是一些具体的类。正如错误消息告诉您的那样,您不能在非虚拟方法上定义期望。因此,如果您希望能够模拟它,那么您应该做的是使用抽象:
IRepository Repository { get; }