Moqベースの単体テストのTargetParameterCountException
質問
" Save"があるリポジトリがあります。方法。また、「作成済み」もスローします。エンティティが保存されるたびのイベント。
Moqを使用してリポジトリをモックアウトしようとしています。...
var IRepository = new Mock<IRepository>();
Request request = new Request();
IRepository.Setup(a => a.Save(request)).Raises(a => a.Created += null, RequestCreatedEventArgs.Empty);
これは機能していないようで、常に例外が発生します:
System.Reflection.TargetParameterCountException: パラメータ数の不一致。
Moqでイベントをモックする例は役に立ちます。
解決
標準のイベントタイプデリゲートには、通常、送信者オブジェクトとサブクラスのEventArgsオブジェクトの2つの引数があります。 Moqはイベントからこのシグネチャを予期しますが、1つの引数のみを検出するため、例外が発生します。
コメントでこのコードを見てください。動作するはずです:
public class Request
{
//...
}
public class RequestCreatedEventArgs : EventArgs
{
Request Request {get; set;}
}
//=======================================
//You must have sender as a first argument
//=======================================
public delegate void RequestCreatedEventHandler(object sender, RequestCreatedEventArgs e);
public interface IRepository
{
void Save(Request request);
event RequestCreatedEventHandler Created;
}
[TestMethod]
public void Test()
{
var repository = new Mock<IRepository>();
Request request = new Request();
repository.Setup(a => a.Save(request)).Raises(a => a.Created += null, new RequestCreatedEventArgs());
bool eventRaised = false;
repository.Object.Created += (sender, e) =>
{
eventRaised = true;
};
repository.Object.Save(request);
Assert.IsTrue(eventRaised);
}
他のヒント
RequestCreatedEventArgs.Empty
から返されるものはすべて、 RequestCreatedEventArgs
オブジェクトに変換できないようです。私は次のことを期待しています:
class IRepository
{
public event THING Created;
}
class THING : EventArgs
{
public static THING Empty
{
get { return new THING(); }
}
}
THINGが上記のコードの各場所で同じクラスであることを確認します。
所属していません StackOverflow