0
我试图单元测试递归表示目录结构的对象,但即使在最简单的级别FluentAssertions ShouldBeEquivalentTo
失败最大递归深度达到。FluentAssertions递归深度到达与递归结构的对象
应该如何写这个测试来正确地让测试通过。
此外,如果添加子节点,我如何停止无限重新比较父节点DirectoryNode
?
这里是代码,它使用Xunit
,FluentAssertions
和System.IO.Abstractions
库。
测试:
[Fact]
public void DirectoryTreeBuilder_BuildTree_String_TopNodeTest()
{
// Arrange
string path = "C:\\";
var mockFileSystem = new MockFileSystem();
mockFileSystem.AddDirectory(path);
var expected = new DirectoryNode
{
Info = mockFileSystem.DirectoryInfo.FromDirectoryName(path),
Children = new List<DirectoryNode>()
};
// Act
var builder = new DirectoryTreeBuilder(mockFileSystem);
var calculated = builder.BuildTree(path);
// Assert
calculated.ShouldBeEquivalentTo(expected);
}
DirectoryNode属性的类:
public class DirectoryNode
{
public DirectoryNode Parent { get; set; }
public DirectoryInfoBase Info { get; set; }
public List<DirectoryNode> Children { get; set; }
public List<FileInfoBase> Files => Info.GetFiles().ToList();
}
树构建:
public class DirectoryTreeBuilder
{
private readonly IFileSystem fileSystem;
public DirectoryTreeBuilder(IFileSystem fileSystem)
{
this.fileSystem = fileSystem;
}
public DirectoryTreeBuilder() : this(new FileSystem())
{
}
public DirectoryNode BuildTree(string path)
{
var directoryInfo = fileSystem.DirectoryInfo.FromDirectoryName(path);
return BuildTree(directoryInfo);
}
public DirectoryNode BuildTree(DirectoryInfoBase directoryInfo)
{
var node = new DirectoryNode
{
Info = directoryInfo,
};
var directories = directoryInfo.GetDirectories();
var children = new List<DirectoryNode>();
// Process list of child directories
foreach (var directory in directories)
{
var child = BuildTree(directory);
child.Parent = node;
children.Add(child);
}
node.Children = children;
return node;
}
}
你有超过十级的目录吗?你尝试过'AllowingInfiniteRecursion'选项吗? – dasblinkenlight
@dasblinkenlight目录结构可能有10个以上的级别;但对于测试我没有那么多。我尝试了'AllowingInfiniteRecursion',但是这会导致进程最终意外中止(这个测试不应该被需要)。 – Ayb4btu