2009-05-19 62 views
0

为了获得良好的测试覆盖率,我想测试WriteExternalReadExternal方法IPortableObject(如Creating an IPortableObject Implementation (.NET)所述)。在.NET中测试Oracle Coherence IPortableObject实现

这里是类似于我在我的测试方法(我喜欢,它的工作原理)的代码。

但得到这个工作,我不得不做的子类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; 
     } 
    } 
} 

回答

0

这个测试是太关心IPofReaderIPofWriter的实际执行。我建议你使用像Rhino Mocks这样的框架来创建读写器的模拟。将你的POF方法传递给模拟的读写器。然后简单地声明读/写方法是用正确的参数调用的。

+0

然后,我会需要一个特定的模拟每个IPortableObject实现,其中这个帮助器可以用于任何对象。另外,我想确保调用(例如,ReadString和WriteString)是平衡的,并且以相同的顺序,我不知道如何模拟。我对实际执行感到遗憾。 – 2009-05-27 22:33:47

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你没有与上下文注册任何序这个工作。