引发模拟对象的事件并作为用于调用方法的参数对象传递给那里

问题描述 投票:0回答:1

我有一个接口

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()?*/ } );
c# unit-testing events mocking moq
1个回答
1
投票

您可以使用

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; }
}

演示@dotnetfiddle.net

© www.soinside.com 2019 - 2024. All rights reserved.