我正在try 模拟一个方法,该方法具有在抽象类中实现的泛型返回类型.
抽象类编码:
public abstract class AbstractRepository<T> where T : class
{
protected virtual async Task<T> GetById(int id)
{
// some code
}
}
实施类:
public class UserRepository : AbstractRepository<User>
{
public Task<User> GetUserById(int id)
{
return base.GetById(id);
}
}
测试方法:
[Theory]
public async Task GetUserById_UserExists_ReturnsUser(User user)
{
Mock<UserRepository> mockRealSut = new(MockBehavior.Strict, new object[] {
})
{
CallBase = true
};
//Setup Mock
//Act
User result = await mockRealSut.Object.GetUserById(1);
}
我无法成功设置Mock,因为实际的抽象方法总是被调用.
我try 了两种方法:
方法1:
_ = mockRealSut.Protected().Setup<Task<User>>("GetById", ItExpr.IsAny<int>()).ReturnsAsync(user);
方法2:
public interface IGetByIdMethodMock<T>
{
Task<T> GetById(int id);
}
_ = mockRealSut.Protected().As<IGetByIdMethodMock<User>>().Setup(m => m.GetById(It.IsAny<int>())).ReturnsAsync(user);
这篇关于Stackoverflow的帖子here似乎表明,方法2)应该有效,但它特定于泛型参数,而不是泛型返回类型.
我已经查看了MOQ文档,但我找不到解决此问题的方案.
我错过什么了吗? 我认为这应该是可能的与Moq,但有些东西是失踪,我找不到的问题.
这种类型的CRUD方法非常常见,所以如果Moq不涵盖这种类型的代码,那就太奇怪了.