2016-08-01 76 views
0

我试图单元测试递归表示目录结构的对象,但即使在最简单的级别FluentAssertions ShouldBeEquivalentTo失败最大递归深度达到FluentAssertions递归深度到达与递归结构的对象

应该如何写这个测试来正确地让测试通过。

此外,如果添加子节点,我如何停止无限重新比较父节点DirectoryNode

这里是代码,它使用Xunit,FluentAssertionsSystem.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; 
    } 
} 
+0

你有超过十级的目录吗?你尝试过'AllowingInfiniteRecursion'选项吗? – dasblinkenlight

+0

@dasblinkenlight目录结构可能有10个以上的级别;但对于测试我没有那么多。我尝试了'AllowingInfiniteRecursion',但是这会导致进程最终意外中止(这个测试不应该被需要)。 – Ayb4btu

回答

0

我发现的问题,DirectoryNode.Info属性包含DirectoryInfoBase这仅仅是一个包装为DirectoryInfo对象。

DirectoryInfo有属性Root它在最高级别(如C:\)将只返回自己。这是FluentAssertions ShouldBeEquivalentTo递归失败的元素。

不幸的是,似乎ShouldBeEquivalentTo可以忽略子属性。