我有一个接口
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 r) =>
mockCommunication.Raise(c => c.RequestReceived += null, r));
// 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; }
}