gpt4 book ai didi

unit-testing - 使用 NUnit 测试适配器进行单元测试失败,但使用 VS2012 中的 ReSharper 则不会

转载 作者:行者123 更新时间:2023-12-02 03:45:40 25 4
gpt4 key购买 nike

当我在 VS2012 中运行我的单元测试时,我遇到了一个奇怪的问题。我正在使用 NUnit 并使用 ReSharper 运行它们,所有测试都在运行。但是当我的同事运行测试时,他们中的一些人没有 ReSharper,因此他们使用扩展名为 NUnit Test Adapter (Beta 3) v0.95.2 ( http://visualstudiogallery.msdn.microsoft.com/6ab922d0-21c0-4f06-ab5f-4ecd1fe7175d ) 的测试资源管理器。但是,随着该扩展,一些测试失败了。

具体失败的代码如下:

public void Clear()
{
this.Items.ForEach(s => removeItem(s));
}

private bool removeItem(SequenceFlow item)
{
int i = this.Items.IndexOf(item);
if (i == -1)
return false;
this.Items.RemoveAt(i);
return true;
}

异常(exception)情况是:

System.InvalidOperationException : Collection was modified; enumeration operation may not execute.
Result StackTrace:
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.List`1.ForEach(Action`1 action)

现在,我不是在寻找一个答案来回答为什么我得到这个异常,当然我能理解它失败的原因。但我无法理解的是,为什么使用 Test Exporer 时测试失败,但使用 ReSharper 时却没有。为什么我会得到不同的测试行为?

在测试这两种情况时,我使用 ildasm.exe 查看代码编译是否不同,但 IL 代码是相同的。

测试也在我们的 Team City 服务器上提交期间运行,没有错误。

此外,在调试测试时,我在通过 NUnit 测试适配器进行调试时遇到了相同的异常,但是在使用 ReSharper 调试和单步执行代码时,完全没有异常。

最佳答案

我发现在 VS2012 中类似的代码会在运行时失败并出现相同的错误。如果您在应用程序中使用此方法,它会成功吗?

您在功能上迭代集合并在您仍在集合中时从中删除项目 - 这会更改集合的内部索引,使迭代的寻址无效。如果您将其编码为:

for(int I=0; I < Items.Count, I++)
{
removeItem(Items[I]);
}

您最终会遇到索引越界错误,因为集合的内部索引会重置。

我不能说 ReSharper,但我猜它有一个比 MS nunit 引擎(或者,就此而言,MS 运行时引擎)更慷慨的运行时引擎。

我在一个应用程序中做了类似的事情,我试图遍历父对象的依赖对象集合并将它们删除。它因您收到的确切错误而失败:最终我使用 linq 查询删除所有附加到指定父级的项目 - 相当于运行 SQL 查询 DELETE FROM table WHERE parentID = parentid

关于unit-testing - 使用 NUnit 测试适配器进行单元测试失败,但使用 VS2012 中的 ReSharper 则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17364286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com