2009-08-02 7 views
3

"保存"メソッドを持つリポジトリがあります。また、エンティティが保存されるたびに「作成済み」イベントがスローされます。MoqベースのユニットテストでTargetParameterCountExceptionが発生しました

我々は

var IRepository = new Mock<IRepository>(); 
Request request = new Request(); 
IRepository.Setup(a => a.Save(request)).Raises(a => a.Created += null, RequestCreatedEventArgs.Empty); 

....のようなリポジトリをモックと部品番号を使用しようとしてきたこれは動作していないようですし、私は常に例外を取得:

システム.Reflection.TargetParameterCountException: パラメーターの数の不一致。

Moqを使って模擬イベントを実行する例は役に立ちます。

答えて

3

標準的なイベントタイプのデリゲートには、通常、送信者オブジェクトと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); 
    } 
0

RequestCreatedEventArgs.Emptyから返されたものは、RequestCreatedEventArgsオブジェクトに変換できないようです。私は、次のことを期待する:

class IRepository 
{ 
    public event THING Created; 
} 
class THING : EventArgs 
{ 
    public static THING Empty 
    { 
     get { return new THING(); } 
    } 
} 

は、上に示したように、その事はあなたのコード内の各場所で同じクラスであることを確認します。

関連する問題