Как я могу предотвратить исключение 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.
В любом случае, вот как исправить проблему:
- В VS выберите Debug | Параметры и настройки... | IntelliTrace | Модули
- В следующем диалоговом окне нажмите Добавить... и введите 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