使用附加调试器运行测试时如何防止 VerificationException?
每当我在附加调试器的情况下运行以下任一单元测试时,我都会在 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
- System.Core
其他一些要点:
- 在没有调试器的情况下运行测试工作正常
- 代码覆盖率已关闭
- 我已将引用的程序集最小化到至少
- 我在 Fusion 日志中没有看到任何错误
- 我尝试应用 SecurityRulesAttribute href="https://stackoverflow.com/questions/3917374/why-do-my-tests-fail-with-system-security-verificationexception">类似问题的答案
- 我尝试了博客中的一些内容发布 VerificationException 和测试
- 在 MSTest 和 Resharper 主机下发生(没有尝试过 NUnit,因为公共线程似乎在“调试器下”)。
- 以管理员或非管理员身份运行 VS 时发生
有谁知道如何防止此 VerificationException
、解决它和/或为什么会导致它?看来程序集这么少,不应该加载任何冲突的程序集。我还将 FluentValidation 卫星程序集移开,但仍然遇到异常。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
好的,我知道了。首先,我要感谢 Jeremy Skinner 用于使用我重现该问题。他的帮助激励我尝试进一步调整我的环境。
为了防止出现此问题,您必须在 Visual Studio 2010 Ultimate 中禁用 IntelliTrace ,或者您必须将 FluentValidation 添加到 IntelliTrace 应排除的模块列表中收集数据。我的网络搜索似乎表明这是一个 IntelliTrace 错误。 Jim Nakashima 在他的 博客文章 说:
我查看了堆栈跟踪并简要浏览了 FluentValidation 源代码,但没有看到这一点。我怀疑这可能是与 LINQ 表达式相关的类似 IntelliTrace 检测错误。
不管怎样,解决这个问题的方法如下:
Ok, I've got it. First I'd like to acknowledge Jeremy Skinner for working with me to reproduce the problem. His help spurred me to try tweaking my environment further.
To prevent the problem you either have to disable IntelliTrace in Visual Studio 2010 Ultimate, or you have to add FluentValidation to the list of modules that IntelliTrace should exclude from collecting data. My web searches seem to indicate it's an IntelliTrace bug. Jim Nakashima in his blog post says:
I looked at my stack trace and briefly through the FluentValidation source, but didn't see this. I suspect it might be a similar IntelliTrace instrumentation bug relating to LINQ expressions.
Anyway, here's how to fix the issue:
我遇到了同样的问题,并发现 TypeMock 6.0 是罪魁祸首。通过禁用 TypeMock Isolator(菜单 TypeMock -> 禁用 TypeMock Isolator),我解决了这个问题。这当然会破坏任何 TypeMock 相关测试。
请注意,当 TypeMock 出现问题时,将 FluentValidation 添加到 IntelliTrace 异常并不能解决问题。
I experienced the same issue and found TypeMock 6.0 to be the culprit. By disabling TypeMock Isolator (menu TypeMock -> Disable TypeMock Isolator) I got rid of the problem. This of course breaks any TypeMock dependent test.
Note that adding FluentValidation to IntelliTrace exceptions does not resolve the issue when TypeMock is the problem.
就我而言,我的 Asp.net MVC 3 应用程序引用了 FluentValidation.dll 和 FluentValidation.mvc.dll 文件。
我删除了引用并使用 nuget 包管理器安装了适用于 MVC 3 的 FluentValidation,并且它有效。
它下载了 FluentValidation.Mvc 版本 5.0.0.1
In my case my Asp.net MVC 3 application had a reference to FluentValidation.dll and FluentValidation.mvc.dll files.
I removed the references and installed the FluentValidation for MVC 3 using nuget package manager and It worked.
It downloaded FluentValidation.Mvc version 5.0.0.1