2

例外をスローすることが予想されるコンストラクターを考えると、次のようになります。

public class MyObject
{
  public MyObject(String name)
  {
    if (String.IsNullOrEmpty(name))
      throw new ArgumentNullException("name");

    this.Initialize();
  }

  protected virtual void Initialize()
  {
    // do stuff
  }
}

Machine.Fakes を Rhino (デフォルト、Rhino に移行中) で使用して、このクラスをモックアップし、それをテストするにはどうすればよいでしょうか。

  1. 予想される例外をスローします
  2. Initialize() を呼び出しません

Moq を使用すると、実際の MyObject クラス自体をモックし、モックCallbase = trueにプロパティを設定して、通常のクラスのように動作させることができます。

次に、例外がスローされたことと、メソッドが呼び出されなかったことの両方を確認できます。

// all pseudo code to prove my point of "creating an instance"
//
void when_creating_new_MyObject_with_null_Name_should_throw_Exception()
{
  // arrange
  Mock<MyObject> myObjectToTest = new Mock<MyObject>(String.Empty);
  myObjectToTest.Callbase = true;

  // act
  Assert.Throws<ArgumentNullException>(() => 
    var instance = myObjectToTest.Object;
  );
}

void when_creating_new_MyObject_with_null_Name_should_not_call_Initialize()
{
  // arrange
  Mock<MyObject> myObjectToTest = new Mock<MyObject>(String.Empty);
  myObjectToTest.Callbase = true;

  // act
  try
  {
    // creates an instance
    var instance = myObjectToTest.Object;
  }
  catch {}

  // assert
  myObjectToTest.Verify(x => x.Initialize(), Times.Never());
}

しかし、MSpec w/Fakes を使用してこれをモックアップする方法がわかりません。

[Subject(typeof(MyObject), "when instantiating a new instance")
class with_null_Name
{
  static MyObject myObjectToTest;
  static Exception expectedException;

  Establish context =()=>
    myObjectToTest = An<MyObject>(String.Empty);

  Because of;  // I don't think there is anything to act on here?

  It should_throw_Exception;
    // how to capture exception with An<T>()?

  It should_not_call_Initialize = () =>
    myObjectToTest.WasNotToldTo(x => x.Initialize());

}

私は自分の行為でを知っていて、Catch.Exception(...)通常は使用しています。Because ofしかし、このユースケースはそれではうまくいかないようです。

任意のポインタをいただければ幸いです。

ありがとう!

免責事項: 実際の使用例は非常に複雑で、キャッシュされたバッキング メンバーを使用すると非常にコストがかかる、初期化する重いオブジェクトがあります。上記のコードは単純化されたバージョンです。

4

2 に答える 2

3

私には、モックのテストを意味がありませんsut。モックの動作は、テストメソッドで定義されています。実際のオブジェクトをテストする必要があります。
この場合、不正なデータが提供されたときに例外がスローされることのみを確認する必要があります。
あなたはやり方を知っていると思いますが、とにかくここにコードがあります:

[Subject(typeof (MyObject), "when instantiating a new instance")]
internal class with_null_Name
{
    static MyObject myObjectToTest;
    static Exception expectedException;

    Because of = () => expectedException = Catch.Exception(
                    () => myObjectToTest = new MyObject(String.Empty));

    It should_fail = () => expectedException.ShouldNotBeNull();
}
于 2013-07-25T15:22:49.343 に答える