【发布时间】:2021-06-16 14:39:29
【问题描述】:
我正在使用通用存储库模式和 这段代码来自我的业务逻辑。
public class FolderManager : GenericManager<Folder>, IFolderService
{
private readonly IGenericDal<Folder> _genericDal;
private readonly IFolderDal _folderDal;
public FolderManager(IFolderDal folderDal,IGenericDal<Folder> genericDal) : base(genericDal)
{
_genericDal = genericDal;
_folderDal = folderDal;
}
public async Task<List<Folder>> GetFoldersByUserId(int id)
{
return await _genericDal.GetAllByFilter(I => I.AppUserId == id && I.IsDeleted == false && I.ParentFolderId==null);
} ...another methods
IFolderService 接口:
public interface IFolderService : IGenericService<Folder>
{
Task<List<Folder>> GetFoldersByUserId(int id);
} ...another methods
我想测试GetFoldersByUserId(int id) 方法,我试过这个:
public class FolderServiceTest
{
private readonly FolderManager _sut;
private readonly Mock<IGenericDal<Folder>> _folderRepoMock = new Mock<IGenericDal<Folder>>();
private readonly Mock<IFolderDal> _folderDalMock = new Mock<IFolderDal>();
public FolderServiceTest()
{
_sut = new FolderManager(_folderDalMock.Object, _folderRepoMock.Object);
}
[Fact]
public async Task GetFoldersByUserId_ShouldReturnListOfFolders_WhenUserExist()
{
//Arrange
Mock<IFolderService> folderServiceMock = new Mock<IFolderService>();
folderServiceMock.Setup(x => x.GetFoldersByUserId(It.IsAny<int>())).ReturnsAsync(GetSampleFolder);
var expected = GetSampleFolder();
//Act
//returns null beacuse _sut does not work with the setup I wrote above
//how can i test this method ?
var actual = await _sut.GetFoldersByUserId(1); /* */
//Assert
Assert.Equal(expected.Count, actual.Count);
for (int i = 0; i < expected.Count; i++)
{
Assert.Equal(expected[i].FolderName, actual[i].FolderName);
Assert.Equal(expected[i].Size, actual[i].Size);
}
}
当我开始测试时,实际值为 null,测试失败。 GetSampleFolder 方法有一个文件夹列表并返回此列表。我的问题是如何测试GetFoldersByUserId(int id) 方法?
【问题讨论】:
-
您的代码看起来不一致: 1. 为什么要定义
folderServiceMock? 2.你在说什么IUserService? 3、“不接受构造函数”是什么意思?GetFoldersByUserId在您的测试设置中调用_genericDal,即_folderRepoMock。它返回 null 是因为您没有设置_folderRepoMock.GetAllByFilter方法来返回任何内容,因此模拟返回 null 而您的GetFoldersByUserId返回此 null。 -
谢谢你,我想我明白了。我写了 folderServiceMock 因为我认为我可以在 _sut 对象中使用它。我在上面的代码中编辑了注释行。我设置了
_folderRepoMock.Setup(x => x.GetAllByFilter(I => I.AppUserId == It.IsAny<int>() && I.IsDeleted == false && I.ParentFolderId == null)).ReturnsAsync(GetSampleFolder),我得到了同样的错误。你有什么想法吗? -
你错过了添加最重要的东西:错误本身:)
NotSupportedException: Unsupported expression: I => (((I.AppUserId == IsAny()) AndAlso (I.IsDeleted == False)) AndAlso (I.ParentFolderId == null))对吗? -
对不起,我忘了添加。我收到此错误
System.NullReferenceException : Object reference not set to an instance of an object.,它来自Assert.Equal(expected.Count, actual.Count);行。我调试了测试代码,我看到actual返回 null -
当您跳过
_folderRepoMock设置时,您会得到 nullrefex。但是当你进行必要的_folderRepoMock设置时,你会得到我提到的notsupex。那是因为 Moq 不支持匹配 Lamba 表达式。
标签: c# .net .net-core moq xunit