月別アーカイブ: 2012年3月

Fakes Framework:Connectへのフィードバックに対し「Professionalに含める予定はない」という回答あり

非常に残念です・・・

VS11 ProfessionalでもFakes Frameworkを使用可能にしてほしい | Microsoft Connect

Thanks for your feedback and for using Moles, and now Fakes. Unfortunately at this point in time we have no plans to ship Fakes as part of the Professional SKU.

広告

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の詳しい使い方を調べつつ紹介していこうと思います。

名前空間の命名で悩む・・・

一般的なC/Sな業務システム作るとき、名前空間の命名にいつも悩みます。

今の自分の解はこんな感じ。

 

基本

(会社名).(システム名).(機能名/ID).(役割)
Takano.MySystem.M010.Client
Takano.MySystem.M010.Service

 

ライブラリ

(会社名).(システム名).(役割)
Takano.MySystem.Log
Takano.MySystem.Data
Takano.MySystem.Message
Takano.MySystem.Client.Forms

 

ソリューションは次のようなフォルダ構成に。

  • root
    • Log
    • Data
    • Message
    • Client
      • Forms
    • M010
      • Client
      • Service

 

でも、未だに最適解が分からないでいます。

なにか自分はこういうルールで付けてるよ、というのがあったら是非教えてください。

Visual Studio 11 Beta:Microsoft Connectにて、どんどん日本語でフィードバックしよう!

先のエントリでも使用したのですが、以下のページからVS11Betaについても日本語でフィードバック可能です。

Visual Studio 日本語ホームページ | Microsoft Connect

 

まず、[フィードバックの送信]ボタンをクリックして・・・

image

 

[Visual Studio/Silverlight/ツール製品名*]にて”Visual Studio 11 Beta”を選択するだけです。

image

 

日本語圏のユーザーも、VS11Betaを試して気付いたことはどんどんフィードバックし、VS11を良い製品にしていきましょう!

Fakes Framework:VS11ProfessionalでもFakes Frameworkが使用できるよう、Connectにフィードバックしました

Fakes Frameworkについてtwitterでつぶやいていたら、@ktz_aliasさんからこんなmentionが来ました。

「えぇっ!?」と思い、VS11 Beta Professionalを入れて確かめてみたら、確かに「Fakes アセンブリに追加」が選択できません。

 

(後で画像入れます)

 

そこで、VS 11 ProでもFakes Frameworkを使えるよう、Microsoft Connectにフィードバックしました。

VS11 ProfessionalでもFakes Frameworkを使用可能にしてほしい | Microsoft Connect

 

賛同してくださる方は、ぜひvoteをお願いします。

正直「Molesすげぇ!」ってなっていたのに、「Fakes(物理的に)使えない!」ってなるのは本当に残念なので。

Fakes Framework:まずはお試し

Molesプロジェクトが凍結されVS11に統合されたFakes Frameworkへ « be free

の記事で述べたように、MolesはFakes Frameworkになってます。

 

というわけで、まずはお試し。今回はVS11 Ultimate Betaを使います。

 

1.単体テストプロジェクト作成

新しいプロジェクトを作成し、テンプレートから[単体テスト プロジェクト]を選択します。

image

 

2.Fakeを作る対象アセンブリを指定する。

Molesの時と同じように、プロジェクトの[参照設定]からFake対象アセンブリを右クリックし、[Fakes アセンブリに追加]を選択します。

image

 

3.Fakeを使う

Molesの時はテストメソッドに[HostType("Moles")]属性が必要でしたが、Fakes Frameworkでは、属性が不要になっています。

その代り、Shim Type(旧Mole Type)を使う際は、次のようにShimsContextクラスのCreateメソッドを使ったusingブロックを使う必要があります。

 

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

 

4.テストを実行する

[テスト]メニューから実行するか、Ctrl+R,Aショートカットキーで全テストを実行してみます。

そうすると、テスト結果が「単体テスト エクスプローラー」に表示されます。

image

 

これまでと違う点で一番大きいのは、やっぱりShimsContext.Create()メソッドのブロックを使う点ですね。

次からは一つ一つFakes Frameworkの挙動を試していこうと思います。

Molesプロジェクトが凍結されVS11に統合されたFakes Frameworkへ

Moles – Isolation framework for .NET – Microsoft Research

Moles has been integrated into Visual Studio 11 as the Fakes Framework. The Moles project is *not* actively developed anymore.

つい最近気づいたのですが、どうやらMolesプロジェクトの成果はVS11の「Fakes Framework」に統合され、Molesプロジェクトとしての活動は凍結されたようです。

 

そのFakes Frameworkがこちら。

Isolating Unit Test Methods with Microsoft Fakes

Microsoft Fakes is an isolation framework for creating delegate-based test stubs and shims in .NET Framework applications. The Fakes framework can be used to shim any .NET method, including non-virtual and static methods in sealed types.

少し見てみたところ、従来「Mole Type」と呼ばれていた、staticメソッドやsealedなメソッドをスタブ化するものが、「Shim Type」に名前を変えているようです。

これからしばらく、Fakes Frameworkを追ってみようと思います。