3

我们有具有“保存”方法的存储库。每当保存实体时,它们还会引发“已创建”事件。

我们一直在尝试使用 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

标准事件类型委托通常有两个参数:发送者对象和 EventArgs 对象的子类。Moq 期望您的事件具有此签名,但仅找到一个参数,这会导致异常。

用我的评论看一下这段代码,它应该可以工作:

    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 回答