2009-05-19 7 views
0

テストのカバレッジを良好にするために、IPortableObjectCreating an IPortableObject Implementation (.NET)で説明)のWriteExternalおよびReadExternalのメソッドをテストしたいとします。.NETでのOracle Coherence IPortableObject実装のテスト

私のテストメソッド(これは私が好きで動作します)と同様のコードです。

しかし、この作業を取得するために、私はAdvanceToを上書きするBeginPropertyPofStreamReaderをオーバーライドするサブクラスPofStreamWriterを行いました。私にはこれは少し面白いにおいがするが、私はよりよい解決策を考え出すことができなかった。以下は私の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)がバランスが取れていることを確認したいと思います。私は実際の執行を考えている。 –

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のために、あなたは、これが動作するために順序どおりコンテキストに何かを登録する必要はありません。

関連する問題