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)
归档时间: |
|
查看次数: |
3223 次 |
最近记录: |