当我注意到时,我正在测试其他东西的圆形参考阻力:
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上测试了它并得到了相同的结果。有没有解决的办法?这是一个错误,还是打算以这种方式停止执行?
答案 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突出显示了参与循环引用循环的其中一行。应该在该行上放置一个断点,然后再次调试测试。从这一点开始,调试器将逐步通过循环引用路径。