如何在使用附加调试器运行测试时阻止VerificationException?

Kit*_*Kit 6 c# debugging exception intellitrace fluentvalidation

每当我运行附带调试器的以下任一单元测试时,我都会VerificationException此时获得一个内部FluentValidation代码(如果需要,将在稍后发布整个堆栈跟踪):

at FluentValidation.Resources.LocalizedStringSource.CreateFromExpression(Expression`1 expression, IResourceAccessorBuilder resourceProviderSelectionStrategy)
in ...\FluentValidation\Resources\LocalizedStringSource.cs:line 66
Run Code Online (Sandbox Code Playgroud)

测试是:

using FluentValidation;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        var c = new MyClass();
        var v = new MyValidator();
        v.Validate(c);
    }

    [TestMethod]
    public void TestMethod2()
    {
        Exception ex = null;
        var done = new ManualResetEvent(false);
        ThreadPool.QueueUserWorkItem(
            o =>
            {
                try
                {
                    TestMethod1();
                }
                catch (Exception e)
                {
                    ex = e;
                }
                finally
                {
                    done.Set();
                }
            });

        done.WaitOne();
        Assert.IsNull(ex);
    }
}

public class MyValidator : AbstractValidator<MyClass>
{
    public MyValidator()
    {
        RuleFor(c => c.MyProperty).GreaterThan(0);
    }
}

public class MyClass
{
    public int MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我在单一解决方案,单项目场景中引用了这些程序集,目标是4.0.30319运行时:

  • FluentValidation v3.0.0.0
  • Microsoft.VisualStudio.QualityTools.UnitTestFramework v10.0.0.0
  • 系统
  • System.Core程序

其他一些观点:

  • 没有调试器运行测试工作正常
  • 代码覆盖率已关闭
  • 我已将引用的组件最小化到最小
  • 我没有在Fusion日志中看到任何错误
  • 我试图应用SecurityRulesAttribute回答类似的问题
  • 我在VerificationException和测试的博客文章中尝试了一些东西
  • 在MSTest和Resharper主机下发生(没有尝试过NUnit,因为通用线程似乎是'在调试器下'.
  • 以管理员或非管理员身份运行VS时发生

有谁知道我如何防止这种情况VerificationException,解决它,和/或为什么会造成这种情况?似乎有这么少的装配,不应该有任何冲突的装载.我还将FluentValidation卫星程序集移开了,但仍然得到了异常.

Kit*_*Kit 12

好的,我知道了.首先,我还要感谢杰里米· 斯金纳和我一起工作来重现问题.他的帮助促使我尝试进一步调整我的环境.

要防止出现此问题,您必须在Visual Studio 2010 Ultimate中禁用IntelliTrace,或者必须将FluentValidation添加到IntelliTrace应从收集数据中排除的模块列表中.我的网络搜索似乎表明它是一个IntelliTrace错误.Jim Nakashima在他的博客文章中说:

问题是IntelliTrace本身有一个错误,当IntelliTrace集合设置为"高"(这是Cloud IntelliTrace场景中的默认值)时,标记为SecurityTransparent的程序集中具有布尔输出参数的方法将失败.

如果您的方法的签名包含布尔输出参数并且您已将程序集安全性设置为SecurityTransparent,您将在自己的代码中看到这一点.

我查看了我的堆栈跟踪并简要介绍了FluentValidation源代码,但没有看到这一点.我怀疑它可能是与LINQ表达式相关的类似IntelliTrace检测错误.

无论如何,这是如何解决问题:

  1. 在VS中,选择Debug | 选项和设置... | IntelliTrace | 模块
  2. 在以下对话框中,单击" 添加...",然后在文本框中输入FluentValidation.

在此输入图像描述