なか日記

一度きりの人生、楽しく生きよう。

MSTestでプライベートメソッドのテストを行う(自力)

昔はNUnitを使っていたのですが、TFSとの連携もし易いしMSTestでいいんじゃない?って気がして専らMSTestを使ってる今日この頃。

プライベートメソッドのテストも右クリックメニューから・・・って思ったんだけどなんかそれっぽいのがないではないか!

プライベートメソッドのテストはそれを利用するパブリックメソッドを通してテストすべきなんて話を聞いたこともあるけど、どうしてもプライベートメソッドのテストが書きたいんだい!ってインターネッツを徘徊してたら、こんなクラスがあることを知ったなり。

PrivateObject クラス (Microsoft.VisualStudio.TestTools.UnitTesting) | Microsoft Docs

ほうほう。VisualStudio2012からはこんな便利なクラスが・・・と思ったら、2005からあったんやね(;゜ロ゜)

使ってみた

製品コード

public class Hoge
{
    private string GetString()
    {
        return "hoge";
    }
}

テストコード

[TestClass]
public class HogeTest
{
    [TestMethod]
    public void テキストを取得する()
    {
        var hoge = new Hoge();
        var pbObj= new PrivateObject(hoge);
        var text = pbObj.Invoke("GetString") as string;
        
        Assert.AreEqual("hoge", text);
    }
}

感想

なんやー、意外と簡単やん。 右クリックメニューから作った方がもっと簡単なんかな?

それにしても、どうやって右クリックメニューからテスト作るんだっけか・・・

追記

ブログを書いたよってTwitterに放流したら、@さんと@さんから5分も立たないうちにツッコミを頂いたw

Chainning Assertionで書き換えたテストコード

[TestClass]
public class HogeTest
{
    [TestMethod]
    public void テキストを取得する()
    {
        var hoge = new Hoge();
        Assert.AreEqual("hoge", hoge.AsDynamic().GetString());
    }
}

Chainning Assertionすばらしい!

去年のAdventCalenderで@さんのエントリ JUnit実践入門 MSTest用パッチ #TddAdventJp - 亀岡的プログラマ日記Chainning Assertionの存在を知って感激したけど、全然ドキュメント読んでなかった…

こんなのブログに書いてゴミエントリ増やして良いのかしら?なんて思ってたけど、とても勉強になりました。