6

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

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
  • 系统
  • 系统核心

其他几点:

  • 在没有调试器的情况下运行测试工作正常
  • 代码覆盖已关闭
  • 我已将引用的程序集降至最低
  • 我在 Fusion 日志中看不到任何错误
  • 我尝试将SecurityRulesAttribute答案应用于类似问题
  • 我在VerificationException 和测试的博客文章中尝试了一些东西
  • 在 MSTest 和 Resharper 主机下都发生(没有尝试过 NUnit,因为公共线程似乎在“调试器下”。
  • 以管理员或非管理员身份运行 VS 时发生

有谁知道我可以如何防止这种情况VerificationException,解决它,和/或为什么会导致它?似乎只有这么少的程序集,不应该加载任何冲突的程序集。我还将 FluentValidation 附属程序集移开,但仍然出现异常。

4

3 回答 3

12

好的,我明白了。首先,我要感谢Jeremy Skinner 一起重现问题。他的帮助促使我尝试进一步调整我的环境。

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

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

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

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

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

  1. 在 VS 中,选择调试| 选项和设置... | 智能追踪| 模块
  2. 在以下对话框中,单击Add...并在文本框中输入 FluentValidation。

在此处输入图像描述

于 2011-07-29T14:58:34.993 回答
1

我遇到了同样的问题,发现 TypeMock 6.0 是罪魁祸首。通过禁用 TypeMock Isolator(菜单 TypeMock -> Disable TypeMock Isolator)我摆脱了这个问题。这当然会破坏任何依赖于 TypeMock 的测试。

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

于 2012-12-11T10:20:47.110 回答
0

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

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

它下载了 FluentValidation.Mvc 版本 5.0.0.1

于 2013-12-28T15:44:27.287 回答