Тестирование реализации Oracle Coherence IPortableObject в .NET - PullRequest
0 голосов
/ 20 мая 2009

Чтобы получить хорошее тестовое покрытие, я хочу протестировать WriteExternal и ReadExternal методы IPortableObject (как описано в Создание реализации IPortableObject (.NET) ).

Вот код, похожий на тот, который у меня есть в моем методе тестирования (который мне нравится, и он работает).

Person person = new Person { Name = "John Doe" };
Person personCopy = CoherenceTestHelper.CopyUsingPofSerialization<Person>(person);
Assert.AreEqual(person, personCopy);

Но чтобы заставить это работать, мне пришлось сделать подкласс PofStreamWriter, чтобы переопределить BeginProperty и PofStreamReader, чтобы переопределить AdvanceTo. Для меня это пахнет немного забавно, но я не мог придумать лучшего решения. Ниже приведен мой действительный код для CoherenceTestHelper.

Вопрос: Кто-нибудь еще тестировал модуль IPortableObject лучше?

public static class CoherenceTestHelper
{
    public static T CopyUsingPofSerialization<T>(T ipoIn) where T : IPortableObject, new()
    {
        T ipoOut = new T();

        IPofContext context = new SimplePofContext();
        using (MemoryStream ms = new MemoryStream())
        {
        IPofWriter writer = new MyPofStreamWriter(new DataWriter(ms), context);
        ipoIn.WriteExternal(writer);

        ms.Seek(0, 0);
        IPofReader reader = new MyPofStreamReader(new DataReader(ms), context);
        ipoOut.ReadExternal(reader);
        }

        return ipoOut;
    }

    private class MyPofStreamWriter : PofStreamWriter
    {
        public MyPofStreamWriter(DataWriter writer, IPofContext context)
        : base(writer, context)
        {
        }

        protected override void BeginProperty(int index)
        {
        }
    }

    private class MyPofStreamReader : PofStreamReader
    {
        public MyPofStreamReader(DataReader reader, IPofContext context)
        : base(reader, context)
        {
        }

        protected override bool AdvanceTo(int index)
        {
        return true;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 16 августа 2012

Я изучал, как выполнить модульное тестирование IPofSerializer, и я ожидаю, что это похоже на вашу проблему. Я обнаружил, что для правильной сериализации и десериализации пользовательского типа необходимо вызвать PofStreamWriter.WriteObject и PofStreamReader.ReadObject. Тип пользователя также должен быть зарегистрирован в PofContext для правильной работы.

Причина этого заключается в том, что класс PofStreamWriter содержит вложенный подкласс, к которому он относится при сериализации пользовательских типов. Этот подкласс записывает дополнительные данные о типе, которые PofStreamReader затем использует для правильной десериализации типа. Без этих дополнительных данных PofStreamReader не может определить, какой это тип и какой сериализатор следует использовать. Похоже, что он просто не настроен на тестирование сериализатора в полной изоляции, так как PofStreamReader и PofStreamWriter должны поддерживать большое количество состояний во время сериализации.

Для тестирования IPofSerializer я делаю следующее

var context = new SimplePofContext()
context.RegisterUserType(1001, typeof(SerializableType), new SerializatableTypeSerializer())

using (var ms = new MemoryStream())
{
    var writer = new PofStreamWriter(new DataWriter(ms), context);
    writer.WriteObject(0, object);

    ms.Seek(0,0);

    var reader = new PofStreamReader(new DataReader(ms), context);
    var ob = reader.ReadObject(0)
} 

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

0 голосов
/ 26 мая 2009

Этот тест слишком связан с фактическим выполнением IPofReader и IPofWriter. Я предлагаю вам создать макет читателя / писателя, используя фреймворк, такой как Rhino Mocks . Передайте ваш метод (ы) POF издевались над читателем / писателем. Затем просто подтвердите, что методы чтения / записи были вызваны с правильными параметрами.

...