c# - 基于 Moq 的单元测试中的 TargetParameterCountException

标签 c# .net exception moq

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

我们一直在尝试使用 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: Parameter count mismatch.

任何使用 Moq 模拟事件的示例都会有所帮助。

最佳答案

标准事件类型委托(delegate)通常有两个参数:发送者对象和 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);
    }

关于c# - 基于 Moq 的单元测试中的 TargetParameterCountException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1219520/

相关文章:

c# - Entity Framework 的表连接性能问题

c# - 在 C# 中获取程序图标?

.net - 使用 .NET 在 Windows 上获取实际文件名(使用适当的大小写)

c# - 为什么未分配的局部变量不自动初始化?

c# - 将列表从代码隐藏转移到 aspx 页面

java - 如何在具有java配置且没有Web.xml的Spring MVC中处理404页面未找到异常

swift - 是否可以使用 "try?"在保护语句中检索异常?

c# - Xamarin iOS - 基于配置文件的代码

c# - 使用什么来构建跨平台应用程序?

c# - Nido的ASP.NET C#异常处理