2

私は、文字列のみを取得して返すことができるCOMオブジェクトのラッパーに取り組んできました。COMオブジェクトのインターフェイスは次のようになります。

    interface IMapinfo
    {
        void Do(string cmd);
        string Eval(string cmd);
    }

これで、次のような基本的な機能をまとめたクラスを作成しました。

    public class Table 
    {
        IMapinfo MI;
        public string Name
        {
            //pass the command to the COM object and get back the name.
            get{return MI.Eval("TableInfo(1,1")");}
        }

    }

ここで、毎回実際のCOMオブジェクトを作成せずに、これらのクラスの単体テストを実行し、ワールドを設定してからテストを実行したいと思います。そのため、モックオブジェクトの使用を検討してきましたが、この状況でモックをどのように使用するかについて少し混乱しています。

私はMoqの使用を計画しているので、このテストを次のように作成しました。

        [Test]
        public void MockMapinfo()
        {
            Moq.Mock<Table> MockTable = new Moq.Mock<Table>();
            MockTable.ExpectGet(n => n.Name)
                .Returns("Water_Mains");

            Table table = MockTable.Object;
            var tablename = table.Name;

            Assert.AreEqual("Water_Mains", tablename,string.Format("tablename is {0}",tablename));
            Table d = new Table();
         }

これは私のCOMオブジェクトをモックする正しい方法ですか?eval関数に送信される文字列のこの真実性はどのように正しいのでしょうか?または私はそれをすべて間違っていますか?

4

1 に答える 1

3

これは重複ですか?COM OLE オブジェクトで TDD を行うにはどうすればよいですか

編集:同じ質問をしているように見えますが、モックコード (OOPS) を検証するためです。

あなたは、あなたの嘲笑のシナリオにはまだ十分ではありません。外部の依存関係を分離したいのは当然であり、COM オブジェクトは確かにその基準を満たしています。私は moq 派ではありませんが (RhinoMocks の方が好きです)、モックの背後にある考え方は相互作用テストです...

インタラクション テストは、まとまりのあるオブジェクトのセットがどのように連携するかに関するものです。このシナリオで有効なテストは、COM オブジェクトの動作に依存するコンポーネントのテストを作成することです。

この場合、COM オブジェクトのラッパーのように機能する「テーブル」も、COM オブジェクトの動作に依存します。議論のために、Table オブジェクトが COM オブジェクトから返された値に対してカスタム ロジックを実行するとします。

モックを使用して COM オブジェクトの動作をシミュレートしながら、Table オブジェクトの独立したテストを作成できるようになりました。

public class Table
{
   public Table(IMapInfo map)
   {
      _map = map;
   }

   public string Name
   {
      get 
      {
        string value = _map.Eval("myexpression");
        if (String.IsNullOrEmpty(value))
        {
            value = "none";
        }
        return value;
      }
   }

   private IMapInfo _map;
}

[TestFixture]
public class TableFixture // is this a pun?
{
   [Test]
   public void CanHandleNullsFromCOM()
   {
       MockRepository mocks = new MockRepository(); // rhino mocks, btw
       IMapInfo map = mocks.CreateMock<IMapInfo>();

       using (mocks.Record())
       {
          Expect.Call(map.Eval("myexpression").Return(null);
       }

       using (mocks.PlayBack())
       {
          Table table = new Table(map);
          Assert.AreEqual("none", table.Name, "We didn't handle nulls correctly.");
       }

       mocks.verify();
   }
}

COM オブジェクトが呼び出されたときに例外をスローするか、文字列式をうまく処理できない可能性があります。COM オブジェクトの実装に縛られることなく、Table オブジェクトが IMapInfo とどのように相互作用するかを実際にテストしています。また、テスト中に IMapInfo オブジェクトを呼び出す必要があるという点で、Table と IMapInfo の間の関係を強化しています。

お役に立てれば。

于 2008-11-20T06:18:28.510 に答える