在引用为循环时,.NET单元测试中的StackOverflow

时间:2018-01-22 23:47:05

标签: c# unit-testing stack-overflow

当我注意到时,我正在测试其他东西的圆形参考阻力:

    public class Foo
    {
        private Bar myBar = new Bar();
    }

    public class Bar
    {
        private Foo myFoo = new Foo();
    }

    [Fact]
    public void CircularReferenceTest()
    {
        var foo = new Foo();
        var bar = new Bar();
    }

导致XUnit runner暂停和控制台日志:

  

中止了主动测试运行。原因:由于StackOverflowException,进程终止。

我在MStest上测试了它并得到了相同的结果。有没有解决的办法?这是一个错误,还是打算以这种方式停止执行?

2 个答案:

答案 0 :(得分:4)

您没有进行循环引用。你正在使一堆引用指向另一个(链接列表,如果你说),最终它会导致堆栈溢出异常,因为堆栈已满。

以下是如何进行循环引用。我不认为你可以将字段保密,因为两个类必须在某种程度上相互了解。 (即在某些时候必须建立这种联系)

public class Foo
{
    public Bar MyBar { get; set; }  
}

public class Bar
{
    public Foo MyFoo { get; set; } 
}

public void CircularReferenceTest()
{
    var foo = new Foo();
    var bar = new Bar();

    foo.MyBar = bar;
    bar.MyFoo = foo;
}

答案 1 :(得分:0)

我也遇到了这个问题:Visual Studio只是悄悄地停止了测试运行,并没有得出结论性的结果,它也没有指出导致问题的原因。它只是停止了带有蓝色图标的测试,表明结果没有定论。在“输出”窗口中,我注意到了相同的错误消息:

  

活动的测试运行被中止。原因:进程由于StackOverflowException而终止。

解决方案是将测试作为“调试选定的测试”来运行。然后,Visual Studio突出显示了参与循环引用循环的其中一行。应该在该行上放置一个断点,然后再次调试测试。从这一点开始,调试器将逐步通过循环引用路径。