3

「保存」メソッドを持つリポジトリがあります。また、エンティティが保存されるたびに「Created」イベントをスローします。

私たちは 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 でイベントをモックする例は役に立ちます。

4

2 に答える 2

3

標準のイベント タイプ デリゲートには、通常、sender オブジェクトとサブクラスの 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);
    }
于 2009-09-14T21:10:33.810 に答える
0

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

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

上記のように、コード内の各場所で THING が同じクラスであることを確認します。

于 2009-09-04T06:14:09.467 に答える