Molesで基底クラスのpublicメソッドの動作を挿げ替える方法

Moles便利ですよね、Moles。皆さん使ってますか?

そんなMolesを使った小ネタを一つ。

 

対象クラス

image

public class MyBase
{
  public string GetHoge()
  {
    return "hoge";
  }
}

public class MyClass : MyBase
{
  public String GetHogeImpl()
  {
    return base.GetHoge();
  }
}

 

派生クラスのメソッドの中で、基底クラスのメソッドを呼ぶパターンです。

このとき、派生クラスのメソッドをテストするのに、基底クラスのメソッドをモックにしたいというようなケースは、割とあると思います。

(このような設計が良いか悪いかは一家言ある方も多いと思いますが、そこは今回は無視するということで一つよろしくお願いします。)

 

Molesを使った解決法

MolesのStubクラスでは基底クラスのメソッドを挿げ替えることはできないため、ちょっとした工夫が要ります。

そこで、基底クラスのMolesクラスを使うことで、この問題を解決できます。

Molesクラスを使う場合、対象となるインスタンスによって、主に次の2つの方法があります。

 

1.全てのインスタンスで処理をモックにしたいケース

基底クラスのMolesクラスのAllInstancesプロパティにて、処理を挿げ替えます。

[TestMethod]
[HostType("Moles")]
public void TestMethod1()
{
  MMyBase.AllInstances.GetHoge = (myBase) => "fuga";

  var a = new MyClass();
  a.GetHogeImpl().Is("fuga"); // Success

  var b = new MyClass();
  b.GetHogeImpl().Is("fuga"); // Success
}

 

2.一部のインスタンスで処理をモックにしたいケース

基底クラスのMolesクラスのコストラクタ引数に、対象となる派生クラスのインスタンスを渡し、そのインスタンスに対する処理を挿げ替えます。

[TestMethod]
[HostType("Moles")]
public void TestMethod1()
{
  var a = new MyClass();
  new MMyBase(a).GetHoge = () => "fuga";
  a.GetHogeImpl().Is("fuga"); // Success

  var b = new MyClass();
  b.GetHogeImpl().Is("hoge"); // Success
}

 

まとめ

Molesかわいいよ、Moles。

広告

Molesで基底クラスのpublicメソッドの動作を挿げ替える方法」への1件のフィードバック

  1. ピンバック: .NET Clips

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中