Pages

2014/06/26

[C#・単体テスト] Shim を利用したアセンブリからの分離

単体テストメソッド作成時に Shim を利用するとメソッドのふるまいを変更したり、.NET アセンブリの呼び出しを変更したりできる。

shim を使用して単体テストでアプリケーションを他のアセンブリから分離する -msdn
http://msdn.microsoft.com/ja-jp/library/hh549176.aspx#AddFakes


サンプルを作成してみて気を付けなければならない(自分がはまった)のは、参照設定の System.dll を右クリックして 「Fakes アセンブリに追加」 を行うことだ。
Exception を判定したければ、catch をする必要があるのではないかと思う(私はテスト実装に慣れていないので他の方法があるかもしれないが)。
なお、shim はメソッドを書き換えるため、動作速度は遅くなる。

テスト対象クラス
namespace Sample
{
    public static class Y2KChecker
    {
        public static void Check()
        {
            if (DateTime.Now == new DateTime(2000, 1, 1))
                throw new ApplicationException("y2kbug!");
        }
    }
}
テストメソッド
[TestMethod]
public void Y2KChecker_発生する()
{
    using (ShimsContext.Create())
    {
System.Fakes.ShimDateTime.NowGet = () => { return new DateTime(2000, 1, 1); };

try
{
    Y2KChecker.Check();
    Assert.Fail();
}
catch (ApplicationException)
{   
}
    }
}

[TestMethod]
public void Y2KChecker_発生しない()
{
   using (ShimsContext.Create())
   {
  System.Fakes.ShimDateTime.NowGet = () => { return new DateTime(2001, 1, 1); };
  try
  {
     Y2KChecker.Check();
  }
  catch (ApplicationException ex)
  {
      Assert.Fail(ex.Message);
  }
  }
}
Related Posts Plugin for WordPress, Blogger...