昔は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に放流したら、@neueccさんと@Posauneさんから5分も立たないうちにツッコミを頂いたw
@nakaji しかしそれもめんどぃのでhoge.AsDynamic().GetString()しまふ #宣伝 http://t.co/jrLj5GrvFE
— neuecc (@neuecc) 2013年4月4日
@nakaji Chainning Assertionの AsDynamicを使うのもシンプルかも、とか思ってみたり。http://t.co/WoHckVcMOV のDynamicAccesorあたりでする。
— 量産型ぽざうね (@Posaune) 2013年4月4日
Chainning Assertionで書き換えたテストコード
[TestClass] public class HogeTest { [TestMethod] public void テキストを取得する() { var hoge = new Hoge(); Assert.AreEqual("hoge", hoge.AsDynamic().GetString()); } }
Chainning Assertionすばらしい!
去年のAdventCalenderで@Posaumeさんのエントリ JUnit実践入門 MSTest用パッチ #TddAdventJp - 亀岡的プログラマ日記 でChainning Assertionの存在を知って感激したけど、全然ドキュメント読んでなかった…
こんなのブログに書いてゴミエントリ増やして良いのかしら?なんて思ってたけど、とても勉強になりました。