C# 使用附加的调试器运行测试时,如何防止VerificationException?

C# 使用附加的调试器运行测试时,如何防止VerificationException?,c#,debugging,exception,fluentvalidation,intellitrace,C#,Debugging,Exception,Fluentvalidation,Intellitrace,每当我在附加了调试器的情况下运行以下任何一个单元测试时,我都会在此时得到一个VerificationException内部代码(如有必要,稍后将发布整个stacktrace): 测试包括: using FluentValidation; using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass] public class UnitTest1 { [TestMethod] public void TestMeth

每当我在附加了调试器的情况下运行以下任何一个单元测试时,我都会在此时得到一个
VerificationException
内部代码(如有必要,稍后将发布整个stacktrace):

测试包括:

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; }
}
使用FluentValidation;
使用Microsoft.VisualStudio.TestTools.UnitTesting;
[测试类]
公共类UnitTest1
{
[测试方法]
公共void TestMethod1()
{
var c=新的MyClass();
var v=新的MyValidator();
v、 验证(c);
}
[测试方法]
公共void TestMethod2()
{
异常ex=null;
var done=新手动重置事件(错误);
ThreadPool.QueueUserWorkItem(
o=>
{
尝试
{
TestMethod1();
}
捕获(例外e)
{
ex=e;
}
最后
{
完成。Set();
}
});
完成。WaitOne();
Assert.IsNull(ex);
}
}
公共类MyValidator:AbstractValidator
{
公共MyValidator()
{
(c=>c.MyProperty).greater大于(0);
}
}
公共类MyClass
{
公共int MyProperty{get;set;}
}
我在单个解决方案、单个项目场景中仅引用了这些程序集,目标是4.0.30319运行时:

  • FluentValidation v3.0.0.0
  • Microsoft.VisualStudio.QualityTools.UnitTestFramework v10.0.0.0
  • 系统
  • 系统核心
其他几点:

  • 在没有调试器的情况下运行测试可以正常工作
  • 代码覆盖率已关闭
  • 我已将引用的程序集最小化到最小值
  • 我在融合日志中没有看到任何错误
  • 我尝试从
  • 我试着从上一篇博文中找到一些东西
  • 在MSTest和Resharper主机下发生(尚未尝试NUnit,因为公共线程似乎处于“调试器下”)
  • 以管理员或非管理员身份运行VS时发生

有人知道我如何防止这个
VerificationException
,解决它,和/或它的原因吗?看起来程序集太少了,加载时不应该有任何冲突。我也将FluentValidation附属程序集移到一边,但仍然会出现异常。

好的,我知道了。首先我想他帮助我尝试进一步调整我的环境

为了防止出现此问题,您必须在Visual Studio 2010 Ultimate中禁用,或者必须将IntelliTrace从收集数据中排除的模块添加到模块列表中。我的web搜索似乎表明这是IntelliTrace错误。他说:

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

如果您有一个签名包含boolean out参数的方法,并且您已经将程序集安全性设置为SecurityTransparent,那么您将在自己的代码中看到这一点

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

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

  • 在VS中,选择调试|选项和设置…|智能跟踪|模块
  • 在下面的对话框中,单击添加…并在文本框中输入FluentValidation

  • 我也遇到了同样的问题,发现TypeMock 6.0是罪魁祸首。通过禁用TypeMock隔离器(菜单TypeMock->Disable TypeMock Isolator),我解决了这个问题。这当然打破了任何依赖TypeMock的测试


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

    在我的例子中,我的Asp.net MVC 3应用程序引用了FluentValidation.dll和FluentValidation.MVC.dll文件

    我删除了引用,并使用nuget package manager安装了MVC 3的FluentValidation,它成功了


    它下载了FluentValidation.Mvc 5.0.0.1版

    我有一个非常类似的问题,但异常是从Razor引发的,我没有IntelliTrace…我可以在家中使用VS Pro运行测试,但在办公室,仍然使用VS Pro,我得到异常。你是如何设法将原因跟踪到IntelliTrace的?我没有直接跟踪到IntelliTracelliTrace,但推断其代码检测和调试模式是某种原因。您的技术堆栈中是否有任何东西检测代码(例如内存/性能分析器、PostSharp等)这可能是其中的一个…TypeMock是这个案例中的问题。版本升级解决了这个问题。TypeMock在我不知道的情况下进行干扰有点可怕。我想知道它是做什么的…?确定它在某处做IL-gen。创建可验证的IL使用,比如反射发射,是很困难的——我经常在t当我认为我做了正确的事情时,他过去了。我也有同样的问题,但这并不能解决它。有什么建议吗?
    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; }
    }