Common Language Runtime обнаружил недопустимую программную ошибку в модульном тестировании
У меня есть следующий код
this.SafeUpdate(rate, Guid.Parse(import.myGuid), c => c.myGuid);
SafeUpdate в основном принимает проанализированное значение guid и применяет его к свойству myGuid объекта rate. Это отлично работает с моего внешнего интерфейса, но выдает ошибку "CLR обнаружено..." при запуске в модульном тесте. Что странно, это то же самое утверждение для DateTime.Parse и int.Parse работает отлично. Это просто терпит неудачу для Guid и десятичных дробей. Я не верю, что ошибка связана с синтаксическим анализом (он имеет правильное проанализированное значение при извлечении в отдельную переменную). Я не верю, что это тоже насмешка, так как оператор отлично работает для всех других типов, кроме guid и decimal. Есть идеи?
1 ответ
Вчера мы столкнулись с подобной ошибкой на нашем сервере сборки. Наше исключение было вызвано методом ReadObject() объекта DataContractSerializer.
System.InvalidProgramException: Common Language Runtime detected an invalid program.
at System.Xml.EncodingStreamWrapper..ctor(Stream stream, Encoding encoding)
at System.Xml.XmlUTF8TextReader.SetInput(Stream stream, Encoding encoding, XmlDictionaryReaderQuotas quotas, OnXmlDictionaryReaderClose onClose)
at System.Xml.XmlDictionaryReader.CreateTextReader(Stream stream, Encoding encoding, XmlDictionaryReaderQuotas quotas, OnXmlDictionaryReaderClose onClose)
at System.Xml.XmlDictionaryReader.CreateTextReader(Stream stream, XmlDictionaryReaderQuotas quotas)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(Stream stream)
Мы написали консольное приложение, которое делает только это. Он работает без ошибок, но не проходит в простом модульном тесте. Мы используем Gallio/MbUnit 3.4.11.0 для нашего тестового фреймворка с целью.net 4.0.
using System;
using System.IO;
using System.Runtime.Serialization;
using MbUnit.Framework;
namespace TestApp
{
[TestFixture]
class Program
{
static void Main()
{
FooBar();
Console.ReadKey();
}
public static void FooBar()
{
var type = typeof(string);
var foo = "foo";
using (var stream = new MemoryStream())
{
var serializer = new DataContractSerializer(type);
serializer.WriteObject(stream, foo);
stream.Seek(0, SeekOrigin.Begin);
var deserializer = new DataContractSerializer(type);
var bar = deserializer.ReadObject(stream);
Console.WriteLine(bar);
}
}
[Test]
public void Test()
{
FooBar();
}
}
}
Приложение работает нормально, но тест выдает. Странно, но этот тест проходит на моем компьютере разработчика, но не проходит на нашем сервере сборки, а также на компьютере разработчика. Ясно, что в моей коробке разработчика есть что-то другое, что позволяет пройти тест, но я еще не обнаружил эту разницу.
Обновление 1 Версия System.dll на моем компьютере разработчика - 4.0.30319.296, но на сервере сборки и на устройстве разработчика моего коллеги - 4.0.30319.1001. System.Xml.dll и System.Runtime.Serialization.dll идентичны на 4.0.30319.1, однако.
Обновление 2 Быстрый поиск в Google по запросу "4.0.30319.1001" возвращает это обновление для системы безопасности, http://support.microsoft.com/kb/2742595, которое было применено как к нашему серверу сборки, так и к коробке разработчика моего коллеги, но не к моей. коробка разработчика. Я удалил обновление на сервере сборки, перезагрузил компьютер, и проблема исчезла! Я думаю, что у Microsoft пока нет модульного теста для этого.:-)