如何在使用附加调试器运行测试时阻止VerificationException?
每当我运行附加调试器的以下任一unit testing时,此时我在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 { 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日志中看到任何错误
- 我尝试将答案中的
SecurityRulesAttribute
应用于类似的问题 - 我在VerificationException和测试的博客文章中尝试了一些东西
- 在MSTest和Resharper主机下发生(没有尝试过NUnit,因为通用线程似乎是’在调试器下’。
- 以管理员或非管理员身份运行VS时发生
有谁知道我怎么能防止这种VerificationException
,解决它,和/或它为什么会被造成? 似乎有这么少的组件,不应该有任何冲突的装载。 我还将FluentValidation卫星程序集移开了,但仍然得到了exception。
好的,我知道了。 首先,我要感谢Jeremy Skinner 与我一起重现这个问题。 他的帮助促使我尝试进一步调整我的环境。
要防止出现此问题,您必须在Visual Studio 2010 Ultimate中禁用IntelliTrace ,或者必须将FluentValidation添加到IntelliTrace应从收集数据中排除的模块列表中。 我的网络搜索似乎表明它是一个IntelliTrace错误。 Jim Nakashima在他的博客文章中说:
问题是IntelliTrace本身有一个错误,当IntelliTrace集合设置为“高”(这是Cloud IntelliTrace场景中的默认值)时,标记为SecurityTransparent的程序集中具有布尔输出参数的方法将失败。
如果您的方法的签名包含布尔输出参数并且您已将程序集安全性设置为SecurityTransparent,您将在自己的代码中看到这一点。
我查看了我的堆栈跟踪并简要介绍了FluentValidation源代码,但没有看到这一点。 我怀疑它可能是与LINQ表达式相关的类似IntelliTrace检测错误。
无论如何,这是如何解决问题:
- 在VS中,选择Debug | 选项和设置… | IntelliTrace | 模块
- 在以下对话框中,单击“ 添加…” ,然后在文本框中输入FluentValidation。
我遇到了同样的问题,发现TypeMock 6.0是罪魁祸首。 通过禁用TypeMock Isolator(菜单TypeMock – >禁用TypeMock Isolator)我摆脱了问题。 这当然会破坏任何与TypeMock相关的测试。
请注意,当TypeMock出现问题时,将FluentValidation添加到IntelliTraceexception并不能解决问题。
在我的情况下,我的Asp.net MVC 3应用程序引用了FluentValidation.dll和FluentValidation.mvc.dll文件。
我删除了引用并使用nuget包管理器安装了FluentValidation for MVC 3并且它工作正常。
它下载了FluentValidation.Mvc版本5.0.0.1