Как я могу предотвратить исключение VerificationException при запуске теста с подключенным отладчиком?

Всякий раз, когда я запускаю любой из следующих модульных тестов с отладчиком, я получаю 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
  • система
  • System.Core

Некоторые другие моменты:

  • Запуск теста без отладчика работает нормально
  • Покрытие кода отключено
  • Я свел свернутые сборки до минимума
  • Я не вижу ошибок в журнале Fusion
  • Я пытался применить SecurityRulesAttribute от ответа на аналогичный вопрос
  • Я попробовал кое-что из сообщения в блоге на VerificationException и тестировании
  • Происходит как на хостах MSTest, так и на хостах Resharper (не пробовал NUnit, потому что общий поток, похоже, находится "под отладчиком").
  • Происходит при запуске VS от имени администратора или не-администратора

Кто-нибудь знает, как я могу предотвратить это VerificationException, обойти это, и / или почему это вызывается? Кажется, с таким небольшим количеством сборок не должно быть никаких конфликтующих загрузок. Я также убрал спутниковые сборки FluentValidation, но все же получил исключение.

3 ответа

Решение

Хорошо, я понял. Сначала я хотел бы поблагодарить Джереми Jeremy Skinner за то, что он работал со мной, чтобы воспроизвести проблему. Его помощь подтолкнула меня к тому, чтобы попытаться изменить свое окружение.

Чтобы предотвратить проблему, вы должны либо отключить IntelliTrace в Visual Studio 2010 Ultimate, либо добавить FluentValidation в список модулей, которые IntelliTrace должен исключить из сбора данных. Похоже, мои поиски в сети указывают на то, что это ошибка IntelliTrace. Джим Накашима в своем блоге говорит:

Проблема заключается в том, что в самой IntelliTrace есть ошибка, из-за которой методы, имеющие логический параметр out в сборке, помеченный как SecurityTransparent, не будут работать, если для коллекции IntelliTrace установлено значение "high", что является значением по умолчанию в сценарии Cloud IntelliTrace.

Вы увидите это в своем собственном коде, если у вас есть метод, чья сигнатура включает логический параметр out, и вы установили безопасность сборки на SecurityTransparent.

Я посмотрел на трассировку своего стека и кратко рассмотрел источник FluentValidation, но не увидел этого. Я подозреваю, что это может быть похожая ошибка инструментария IntelliTrace, связанная с выражениями LINQ.

В любом случае, вот как исправить проблему:

  1. В VS выберите Debug | Параметры и настройки... | IntelliTrace | Модули
  2. В следующем диалоговом окне нажмите Добавить... и введите FluentValidation в текстовое поле.

Я столкнулся с той же проблемой и обнаружил, что виноват TypeMock 6.0. Отключив TypeMock Isolator (меню TypeMock -> Disable TypeMock Isolator) я избавился от проблемы. Это, конечно, нарушает любой зависимый от TypeMock тест.

Обратите внимание, что добавление FluentValidation к исключениям IntelliTrace не решает проблему, когда проблема заключается в TypeMock.

В моем случае приложение Asp.net MVC 3 имело ссылку на файлы FluentValidation.dll и FluentValidation.mvc.dll.

Я удалил ссылки и установил FluentValidation для MVC 3, используя менеджер пакетов nuget, и это сработало.

Он скачал FluentValidation.Mvc версии 5.0.0.1

Другие вопросы по тегам