Как создать экземпляр DataReceivedEventArgs или иметь возможность заполнить его данными? - PullRequest
4 голосов
/ 30 августа 2009

Я запускаю процесс и перенаправляю поток ошибок, чтобы иметь возможность проанализировать его и узнать, что произошло. Я делаю это так:

_proc.ErrorDataReceived += new DataReceivedEventHandler(NetErrorDataHandler);

Где NetErrorDataHandler имеет следующую подпись:

private void NetErrorDataHandler(object sendingProcess, DataReceivedEventArgs errLine)

Пока что мне нужно работать с DataReceivedEventArgs, но я не уверен, как это проверить. В настоящее время я запускаю процесс, с которым работаю. Вы не можете создать экземпляр DataReceivedEventArgs с дополнительными данными, так как я могу преодолеть это препятствие? Единственный способ понять, как это сделать сейчас, - это создать процесс, который бы сделал всю работу за меня. Однако, это не лучший вариант для тестирования.

Ответы [ 2 ]

7 голосов
/ 30 августа 2009

Я только что узнал, что можно создавать объекты с внутренними конструкторами и задавать внутренние поля. Очевидно, что это не рекомендуется, но это будет работать для краткосрочной насмешки. Вот пример:

    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;

    }

Используйте как таковое:

DataReceivedEventArgs TestEventArgs = CreateMockDataReceivedEventArgs("Test");

... это заняло немного исследований, я не думал, что это было возможно: -)

2 голосов
/ 30 августа 2009

Какие данные использует ваше приложение из DataReceivedEventArgs?

Ваше лучшее решение может заключаться в том, чтобы обернуть DataReceivedEventArgs классом, в который вы можете вставить данные для тестирования, а затем передать его методу реализации вместо выполнения всей вашей работы внутри текущего обработчика событий.

Позвольте мне показать вам. Сначала создайте свой класс обёртки:

internal class CustomDataReceivedEventArgs : EventArgs
{

    public string Data { get; set; }


    public CustomDataReceivedEventArgs(string _Data) 
    {
        Data = Data;
    }

    public CustomDataReceivedEventArgs(DataReceivedEventArgs Source) 
    {
        Data = Source.Data;
    }
}

Затем перенесите реализацию обработчика событий в новый метод:

    private void NetErrorDataHandler_Implementation(object sendingProcess, 
        CustomDataReceivedEventArgs errLine) 
    {
        //Your actual event handling implementation here...
    }

Наконец, установите ваш обработчик событий, чтобы он ничего не делал, кроме как вызывал новый метод:

    private void NetErrorDataHandler(object sendingProcess, 
        DataReceivedEventArgs errLine)
    {
        NetErrorDataHandler_Implementation(sendingProcess, 
            new CustomDataReceivedEventArgs(errLine));
    }

Теперь вы можете протестировать вашу реализацию, вызвав вашу реализацию следующим образом:

        NetErrorDataHandler_Implementation(new object(),
            new CustomDataReceivedEventArgs("My Test Data"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...