Модульное тестирование Moq + - Как я могу передать Действие своему классу, чтобы проверить, вызывается ли это Действие? - PullRequest
1 голос
/ 11 октября 2011

По сути, у меня в классе есть метод, который вызывает Action<T>, если выполняются определенные условия. Как выполнить модульное тестирование, чтобы убедиться, что действие вызывается?

public class MyClass<T>
{
    private IDBService _dbService;

    private Action<T> _action;

    public MyClass(IDBService dbService, Action<T> action)
    {
        if (dbService == null) throw new ArgumentNullException("dbService");
        if (action == null) throw new ArgumentNullException("action");

        _dbService = dbService;
        _action = action;
    }

    public void CallActionIfPossible(T param)
    {
        if (_dbService.IsTopUser)
            action(param);
    }
}

Ответы [ 2 ]

6 голосов
/ 11 октября 2011

Ну, основная идея в том, что Action<T> где-то производит какое-то изменение состояния (если нет, какой смысл?).Итак, модульная проверка, что ожидаемое изменение состояния происходит, когда условия выполняются, и что ожидаемое изменение состояния не происходит, когда условия не выполняются.

Конечно, в идеале, вы высмеиваете Action<T>что государственное тестирование супер просто.Для этого вам не нужен Moq или какой-либо другой фальшивый фреймворк:

bool actionWasInvoked = false;
Action<Foo> action = foo => actionWasInvoked = true;
Bar<Foo> bar = new Bar<Foo>();
// set up conditions that should guarantee action is invoked
bar.M(action);
Assert.IsTrue(actionWasInvoked);

и

bool actionWasInvoked = false;
Action<Foo> action = foo => actionWasInvoked = true;
Bar<Foo> bar = new Bar<Foo>();
// set up conditions that should guarantee action is NOT invoked
bar.M(action);
Assert.IsFalse(actionWasInvoked);

Конечно, я не знаю ваших точных настроек.Может быть, вы передаете action для построения Bar, или, возможно, у вас есть какой-то другой способ задания действия.Но идея должна быть ясной.

2 голосов
/ 18 января 2013

Ответ Джейсона хорош, но одна оговорка, которую часто упускают из виду, заключается в том, что вам часто нужно проверять определенное количество вызовов (например, не только он был вызван, но и был вызван ровно один раз). Поэтому я часто делаю что-то вроде этого:

var callCount = 0;
Action<Foo> action = _ => callCount++;
Bar<Foo> bar = new Bar<Foo>();
// set up conditions that should guarantee action is invoked
bar.M(action);
Assert.That(callCount, Is.EqualTo(1));
...