如何模拟SerialDataReceivedEventArgs

PVi*_*itt 6 c# unit-testing mstest moq

我有一个外围驱动程序,它使用串行端口与外围设备通信.我想对这个驱动程序进行单元测试,并试图模拟串口.因此,我为框架类型SerialPort创建了一个包装器,以使其实现一个接口:

public interface IScannerPort
{
    Handshake Handshake { get; set; }
    bool IsOpen { get; }

    event SerialDataReceivedEventHandler DataReceived;

    void Close( );
    void Open( );
    string ReadLine( );
}
Run Code Online (Sandbox Code Playgroud)

现在我使用moq创建了一个模拟:

Mock<IScannerPort> scannerPort = new Mock<IScannerPort>( );
Run Code Online (Sandbox Code Playgroud)

然后我想提出这个DataReceived事件.但是SerialDataReceivedEventArgs不允许我设置EventType属性.所以我也尝试模拟SerialDataReceivedEventArgs,最后用

Mock<SerialDataReceivedEventArgs> args = new Mock<SerialDataReceivedEventArgs>();
args.SetupProperty(a => a.EventType, SerialData.Eof);
Run Code Online (Sandbox Code Playgroud)

但第二行引发NotSupportedException:非虚拟(在VB中可覆盖)成员上的无效设置:a => a.EventType

我该如何举办活动?或者我如何模拟事件args?

PVi*_*itt 10

SerialDataReceivedEventArgs不一定被模拟.可以使用反射创建它的实例:

ConstructorInfo constructor = typeof (SerialDataReceivedEventArgs).GetConstructor(
    BindingFlags.NonPublic | BindingFlags.Instance,
    null,
    new[] {typeof (SerialData)},
    null);

SerialDataReceivedEventArgs eventArgs = 
    (SerialDataReceivedEventArgs)constructor.Invoke(new object[] {SerialData.Eof});
Run Code Online (Sandbox Code Playgroud)

然后可以使用vent args的"真实"实例在模拟的实例上引发事件:

scannerPort.Raise( s => s.DataReceived += null, eventArgs );
Run Code Online (Sandbox Code Playgroud)