Как проверить делегированный метод - PullRequest
0 голосов
/ 12 ноября 2010

У меня есть простой метод в классе, который отвечает за регистрацию FileSystemWatcher с определенным путем в appconfig.xml:

public void ListenPath(string path){
    //path validation code
    //...

    FileSystemWatcher objFileWatcher = new FileSystemWatcher();
        objFileWatcher.Path = path;
        objFileWatcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
       | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        objFileWatcher.Filter = "*.txt";
        objFileWatcher.Created += new FileSystemEventHandler(ProcessInput);
        objFileWatcher.EnableRaisingEvents = true;
}

В моем модульном тесте я должен утверждать:

1) Если указан неправильный или нулевой путь, он должен вызвать PathNotFoundException

2) Этот метод ProcessInput был правильно зарегистрирован для прослушивания «пути» при создании файлов.

Как выполнитьмодульный тест для пункта 2?

спасибо большое

Ответы [ 3 ]

1 голос
/ 12 ноября 2010

Регистрация обратного вызова для события - это просто заполнение переменной.Это более или менее добавление обратного вызова в список обратных вызовов.Я обычно не проверяю случайные вещи, такие как заполнение списка, если только заполнение данных не является целой точкой класса (например, если класс представляет пользовательскую структуру данных).

Вместо этого вы можете проверить, ProcessInputвызывается при изменении указанного файла.Несколько способов сделать это:

  • Проверить побочные эффекты ProcessInput, например, он заполнил какую-то другую структуру или свойство в вашей программе
  • Отделить метод ProcessInputв другой класс или интерфейс.Возьмите ссылку на этот тип в качестве аргумента ListPath или конструктора для класса.Затем смоделируйте этот тип

Пример фиктивного объекта:

public interface IInputProcessor
{
    void ProcessInput(Object sender, FileSystemEventArgs e);
}

public class ClassUnderTest
{
    public ClassUnderTest(IInputProcessor inputProcessor)
    {
        this.inputProcessor = inputProcessor;
    }

    public void ListenPath(string path){
        // Your existing code ...
        objFileWatcher.Created +=
            new FileSystemEventHandler(inputProcessor.ProcessInput);
        // ...
    }

    private IInputProcessor inputProcessor;
}

public class MockInputParser : IInputProcessor
{
    public MockInputParser()
    {
        this.Calls = new List<ProcessInputCall>();
    }

    public void ProcessInput(Object sender, FileSystemEventArgs args)
    {
        Calls.Add(new ProcessInputCall() { Sender = sender, Args = args });
    }

    public List<ProcessInputCall> Calls { get; set; }
}

public class ProcessInputCall
{
    public Object Sender;
    public FileSystemEventArgs Args;
}

[Test]
public void Test()
{
    const string somePath = "SomePath.txt";
    var mockInputParser = new MockInputParser();
    var classUnderTest = new ClassUnderTest(mockInputParser);
    classUnderTest.ListenPath(somePath);
    // Todo: Write to file at "somePath"
    Assert.AreEqual(1, mockInputParser.Calls.Count);
    // Todo: Assert other args
}
0 голосов
/ 12 ноября 2010

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

0 голосов
/ 12 ноября 2010

Если FileSystemWatcher - это то, к чему у вас есть доступ, вы можете настроить его так, чтобы вы могли высмеивать срабатывание события Created.Но я подозреваю, что это не так, а это означает, что вы попадаете в точку, где настоящее «модульное тестирование» не очень легко.

Вы можете попробовать использовать изолятор типа TypeMock или, возможно, Moles, чтобы имитировать запуск события Created.Но самой простой вещью может быть на самом деле написать тест, который создает файл по заданному пути, и убедиться, что метод ProcessInput вызывается, когда это происходит.

Поскольку вы не показали определение или любой другой кодЧто касается самого ProcessInput, я не знаю, как лучше всего обеспечить его вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...