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 пока нет модульного теста для этого.:-)

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