Mocking .NET 3.5

Mocking .NET 3.5

TypeMock の最新版では、LINQ を利用するところを Mocking できる。
こういうときは Natural Mocks の威力発揮だな。
テスト可能にするために実コードに対する修正をしたり、アクロバティックなコードを書くのは、
品質向上に対して良くないと思われるので TypeMock を利用することはかなり検討する価値がある。

サンプルコードそのままコピペ(コメントだけ日本語化)

// C# 
    /// サンプルデータ。実際には利用しない
    private List<Customer> m_CustomerList = new List<Customer> {
                new Customer{ Id = 1, Name="Dave", City="Sarasota" },
                new Customer{ Id = 2, Name="John", City="Tampa" },
                new Customer{ Id = 3, Name="Abe", City="Miami" }
            };
    /// <summary> 
    /// LINQ 呼び出しの モックサンプル
    /// </summary> 
    [TestMethod]
    [VerifyMocks]
    public void MockComplexQuery()
    {
        // 返り値として利用する にせオブジェクト fake
        var fake = new[] {new {Name="mock",City="LA"},
                          new {Name="mock2",City="NY"}};
        // ここから モック の指定
        using (RecordExpectations r = new RecordExpectations())
        {
            // LINQ呼び出しをモックする指示
            var answer =
                  from c in m_CustomerList
                  where c.City == "Sarasota"
                  select new { c.Name, c.City };
            // 上記呼び出しに対する 返り値は fake を利用する
            r.Return(fake);
        }

        // 実際に実行されるテストコード
        var actual =
                  from c in m_CustomerList
                  where c.City == "Sarasota"
                  select new { c.Name, c.City };
        // fake が返ってきたかどうか確認
        Assert.AreEqual(2, actual.Count());
        Assert.IsTrue(actual.Contains(new { Name = "mock", City = "LA" }));
        Assert.IsTrue(actual.Contains(new { Name = "mock2", City = "NY" }));
    }

でも現時点で LINQ って使いどころがいまいちわからん。
抽象化して、[操作]に対して[データの入れ物]を可換にしたいんだろうとは思うんだけど、
あんまり抽象化すると最適化できないわけで。

LINQ to (SQLServerでない何か) の場合に、SQL Server みたいにインデックス付与を後から差し込んでチューニングできる、
とかになれば嬉しそうだ。WCF と同様に config の書き換えでチューニング、
動作した結果は変わらないけどスピードが変わるみたいな。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。