0

为了获得良好的测试覆盖率,我想测试(如创建 IPortableObject 实现 (.NET)WriteExternal中所述)的和ReadExternal方法。IPortableObject

这是类似于我的测试方法中的代码(我喜欢它,并且它有效)。

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

但是为了让它工作,我必须做子类PofStreamWriter来覆盖BeginPropertyPofStreamReader覆盖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;
        }
    }
}
4

2 回答 2

0

我一直在研究如何对 IPofSerializer 进行单元测试,我希望它与您的问题相似。我发现为了正确序列化和反序列化用户类型,您必须调用 PofStreamWriter.WriteObject 和 PofStreamReader.ReadObject。用户类型也必须在 PofContext 中注册才能正常工作。

这样做的原因是 PofStreamWriter 类包含一个嵌套子类,它在序列化用户类型时委托给该子类。该子类写入有关 PofStreamReader 然后用于正确反序列化类型的类型的附加数据。如果没有这些附加数据,PofStreamReader 无法确定它是什么类型以及应该使用什么序列化程序。看起来它只是没有设置为允许在完全隔离的情况下测试序列化程序,因为在序列化时 PofStreamReader 和 PofStreamWriter 在内部维护了很多状态。

为了测试 IPofSerializers 我正在执行以下操作

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)
} 

我怀疑但尚未测试过,对于 IPortableObjects,您无需在上下文中注册任何内容即可使其正常工作。

于 2012-08-16T11:10:43.850 回答
0

该测试过于关注IPofReaderand的实际执行IPofWriter。我建议您使用Rhino Mocks之类的框架创建读取器/写入器的模拟。将您的 POF 方法传递给模拟的读取器/写入器。然后简单地断言使用正确的参数调用了读/写方法。

于 2009-05-26T17:06:15.363 回答