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

时间:2011-07-27 13:48:14

标签: c# debugging exception fluentvalidation intellitrace

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

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

测试是:

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; }
}

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

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

其他一些观点:

  • 在没有调试器的情况下运行测试正常
  • 代码覆盖率已关闭
  • 我已将引用的程序集最小化到最小
  • 我在Fusion日志中看不到任何错误
  • 我尝试应用answer to a similar question
  • 中的SecurityRulesAttribute
  • 我在VerificationException and testing
  • 上的博客文章中尝试了一些内容
  • 在MSTest和Resharper主机下发生(没有尝试过NUnit,因为普通线程似乎是'在调试器下'。
  • 以管理员或非管理员身份运行VS时发生

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

3 个答案:

答案 0 :(得分:12)

好的,我知道了。首先,我要感谢Jeremy Skinnerworking with me重现问题。他的帮助促使我尝试进一步调整我的环境。

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

  

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

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

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

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

  1. 在VS中,选择调试 | 选项和设置...... | IntelliTrace |的模块
  2. 在以下对话框中,点击添加... ,然后在文本框中输入FluentValidation。
  3. enter image description here

答案 1 :(得分:1)

我遇到了同样的问题,发现TypeMock 6.0是罪魁祸首。通过禁用TypeMock Isolator(菜单TypeMock - &gt;禁用TypeMock Isolator),我解决了这个问题。这当然会破坏任何与TypeMock相关的测试。

请注意,当TypeMock出现问题时,将FluentValidation添加到IntelliTrace异常并不能解决问题。

答案 2 :(得分:0)

在我的情况下,我的Asp.net MVC 3应用程序引用了FluentValidation.dll和FluentValidation.mvc.dll文件。

我删除了引用并使用nuget包管理器为MVC 3安装了FluentValidation并且它工作正常。

下载了FluentValidation.Mvc版本5.0.0.1