Fakes Framework:そもそもFakes Frameworkとは何か?

Fakes Frameworkの動作について説明していく前に、そもそも「Fakes Framework」とはなんなのでしょうか?

それは一言で言えば「Test Doubleを作るためのフレームワーク」ということになります。

 

では、Test Doubleとはなんでしょう?次のエントリから引用します。

xUnit Test PatternsのTest Doubleパターン(Mock、Stub、Fake、Dummy等の定義) – 千里霧中

Test Doubleとは、テスト実行時に、テスト対象が依存しているコンポーネントと置き換わるものです。「テスト代役」と訳されることもあります。世の中でMock、Stub、Fake、Dummyなどと呼ばれているものの総称に位置づけられます。

 

こういったTest Doubleを作る.NET言語で使用できるライブラリでは「Moq」が有名です。先日ASP.NET MVC/Web API/WebPagesがオープンソースで公開されましたが、そのテストコードにもMoqが使われていました。

Moqは素晴らしいライブラリです。一般的な用途ではMoqでも十分でしょう。

 

しかし、Fakes FrameworkにはMoqなどのライブラリとは一線を画した特徴があります。

それは「staticメソッド、virtualでないメソッド、sealedなクラス」など、従来の「継承を用いたフレームワーク」では差し替えることが不可能だったケースでも、それが可能であるということです。

 

ここで、前回のコードをもう一度見てみましょう。

 

[TestMethod]
public void TestMethod1()
{
  using (ShimsContext.Create())
  {
    ShimDateTime.NowGet = () => new DateTime(2012, 1, 1);
    Assert.AreEqual(new DateTime(2012, 1, 1), DateTime.Now);
  }
}

 

このコードでは、DateTime型のNowプロパティを差し替えています。

まず、DateTime型は構造体であるため、継承が不可能です。また、Nowプロパティはstaticプロパティであるため、もし継承できたとしても差し替えることはできません。

 

こういったケースでは従来であれば、GetNow仮想メソッドを作り、それを差し替えるやり方を採る必要がありました。

 

class MyClass
{
  public virtual DateTime GetNow()
  {
    return DateTime.Now;
  }
}

class TestingMyClass : MyClass
{
  public override DateTime GetNow()
  {
    return new DateTime(2012, 1, 1);
  }
}
    
[TestMethod]
public void TestMethod2()
{
  MyClass clazz = new TestingMyClass();
  Assert.AreEqual(new DateTime(2012, 1, 1), clazz.GetNow());
}

 

Fakesを使うと、こういった手間をなくすことができます。つまり「テスト可能にするために設計を崩す」ケースを少なくできるのです。

ただ、この方法をとることの副作用として、ビルド時間が多少増えてしまいますが、得られるメリットから考えれば微々たるものだと考えます。

 

次回以降は実際にFakes Frameworkの詳しい使い方を調べつつ紹介していこうと思います。

広告

Fakes Framework:そもそもFakes Frameworkとは何か?」への1件のフィードバック

  1. ピンバック: .NET Clips

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中