【问题标题】:Unit test fails with NUnit Test Adapter but not with ReSharper in VS2012使用 NUnit 测试适配器进行单元测试失败,但在 VS2012 中使用 ReSharper 失败
【发布时间】:2013-06-26 04:51:06
【问题描述】:

我在 VS2012 中运行单元测试时出现了一个奇怪的问题。我正在使用 NUnit 并使用 ReSharper 运行它们,并且所有测试都在工作。但是,当我的同事运行测试时,他们中的一些人没有 ReSharper,因此他们使用扩展名为 NUnit 测试适配器 (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;
    }

例外是:

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 调试和单步调试代码时,根本没有异常。

【问题讨论】:

  • 这段代码是从哪里调用的? TestMethod、SetUp、构造函数?
  • 从测试方法,当我“代理”单元测试时。
  • 我看不出这会失败的任何原因。你能得到一个我可以下载并查看的复制项目吗?把它放在一个要点上,还是什么?
  • @citizenmatt 当我们遇到这个奇怪的问题时,我已经上传了一个示例解决方案。该测试在 ReSharper 上运行良好,在安装了 NUnit 测试适配器的 VS2012 中使用默认测试资源管理器失败。 dl.dropboxusercontent.com/u/10143511/ClassLibrary1.zip

标签: unit-testing visual-studio-2012 nunit resharper


【解决方案1】:

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

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

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

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

我无法与 ReSharper 交谈,但我猜想它的运行时引擎比 MS nunit 引擎(或者,就此而言,MS 运行时引擎)更慷慨。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多