例外をスローすることが予想されるコンストラクターを考えると、次のようになります。
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 に移行中) で使用して、このクラスをモックアップし、それをテストするにはどうすればよいでしょうか。
- 予想される例外をスローします
- 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
しかし、このユースケースはそれではうまくいかないようです。
任意のポインタをいただければ幸いです。
ありがとう!
免責事項: 実際の使用例は非常に複雑で、キャッシュされたバッキング メンバーを使用すると非常にコストがかかる、初期化する重いオブジェクトがあります。上記のコードは単純化されたバージョンです。