我正在启动一个进程并重定向错误流以便能够解析它并知道发生了什么.我是这样做的:
_proc.ErrorDataReceived += new DataReceivedEventHandler(NetErrorDataHandler);
Run Code Online (Sandbox Code Playgroud)
NetErrorDataHandler具有以下签名:
private void NetErrorDataHandler(object sendingProcess, DataReceivedEventArgs errLine)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我必须使用DataReceivedEventArgs,但我不确定如何测试它.目前我正在运行我正在使用的流程.你不能用额外的数据创建DataReceivedEventArgs的实例,那么我该如何克服这个障碍呢?我现在看到如何做到这一点的唯一方法是创建一个可以为我工作的流程.但是,这不是测试目的的最佳选择.
我刚刚发现可以使用内部构造函数创建对象并设置内部字段.显然,这是沮丧的,但它可以用于短期嘲笑.这是一个例子:
private DataReceivedEventArgs CreateMockDataReceivedEventArgs(string TestData)
{
if (String.IsNullOrEmpty(TestData))
throw new ArgumentException("Data is null or empty.", "Data");
DataReceivedEventArgs MockEventArgs =
(DataReceivedEventArgs)System.Runtime.Serialization.FormatterServices
.GetUninitializedObject(typeof(DataReceivedEventArgs));
FieldInfo[] EventFields = typeof(DataReceivedEventArgs)
.GetFields(
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.DeclaredOnly);
if (EventFields.Count() > 0)
{
EventFields[0].SetValue(MockEventArgs, TestData);
}
else
{
throw new ApplicationException(
"Failed to find _data field!");
}
return MockEventArgs;
}
Run Code Online (Sandbox Code Playgroud)
使用原样:
DataReceivedEventArgs TestEventArgs = CreateMockDataReceivedEventArgs("Test");
Run Code Online (Sandbox Code Playgroud)
...这需要一些研究,我认为不可能:-)