我有一个接口IPeakCommunication和派生类PeakCommunication.在派生类内部,我有一个方法Send(RequestData request)的实现,它做一些事情,正如我所预期的那样,它调用事件RequestReceived并传递参数request.

我会为一些与IPeakCommunication交互的类创建单元测试,并调用Send(RequestData request)方法.但是我不知道如何创建一个Mock,它从参数中获取一个对象并使用它来调用RequestReceived事件.

public interface IPeakCommunication : IDisposable
{
#region Delegates
delegate void PeakRequestReceivedHandler(RequestData data);
#endregion

#region Events
event PeakRequestReceivedHandler? RequestReceived;
#endregion

#region Methods
void Send(RequestData data);
#endregion
}

我试图编写的代码如下:

var mockCommunication = new Mock<IPeakCommunication>();
mockCommunication.Setup(x => x.Send(It.IsAny<RequestData>()))
    .Raises(x => x.RequestReceived += null, new object[] { /*argument from Send()?*/ } );

推荐答案

您可以使用Callback:

var mockCommunication = new Mock<IPeakCommunication>();

// Setup with callback which uses Raise
mockCommunication.Setup(x => x.Send(It.IsAny<RequestData>()))
    .Callback((RequestData rd) => 
        mockCommunication.Raise(c => c.RequestReceived += null, rd));

// Act
var obj = mockCommunication.Object;
// sample subscriber:
obj.RequestReceived += rd => Console.WriteLine(rd.Data);
obj.Send(new RequestData { Data = 42 }); // Prints 42

// sample data object
public class RequestData
{
    public int Data { get; set; }
}

Demo @dotnetfiddle.net

Csharp相关问答推荐

使用C#中的Shape API从Azure目录获取所有用户

更改对象的旋转方向

System. InvalidOperationException:无法将数据库中的字符串值i转换为映射的ItemType枚举中的任何值''''

为什么将鼠标悬停在DateTimeOffset上只显示Hour值?

从应用程序图API调用访问所有者字段

只有第一个LINQ.Count()语句有效

如何将不同类型的扩展参数的javascript函数转换成C#风格?

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

C#使用TextFieldParser读取.csv,但无法使用";0";替换创建的列表空条目

将字节转换为 struct 并返回

如何在CSharp中将json字符串转换为DataTable?

如何更改新创建的实例的变量?

用于获取字符串的最后12个字符的正则表达式(空格除外)

如何在特定环境中运行dotnet测试?

如何将默认区域性更改为fr-FR而不是en-US?

如何在使用Google.Drive.apis.V3下载文件/文件夹之前压缩?

如何在Cake脚本中设置MSBuild.exe的绝对路径

Avalonia MVVM数据模板

方法加载时出现类型加载异常