2014-06-01 4 views
1

У меня есть метод (некоторые кода удалены):Как модульного тестирования задачи из частного метода

try 
{ 
    var task = Task.Factory.StartNew(ValidateAccounts, _token); 
} 
catch (AggregateException) 
{ 
    _tokenSource = new CancellationTokenSource(); 
    _token = _tokenSource.Token; 
} 

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

+7

Модульные испытания не предназначены для проверки внутреннего поведения компонентов, но для обеспечения выхода для определенного входа. Если есть что-то, что вы не можете проверить, вероятно, вам следует пересмотреть архитектуру вашего компонента, модификаторы доступа или просто проверить поведение. –

ответ

2

Как уже упоминалось, вы должны быть осторожны, когда наступаете на тонкую линию того, что нужно проверить, а что - не -to-test. Это может привести к хрупким испытаниям, которые слишком связаны с реализацией.

Это, как говорится, я абсолютно вижу полезность в том, что вы пытаетесь сделать. Тестирование обработки исключений само по себе стоит задать этот вопрос.

Проблема связана с использованием статического объекта (Task.Factory). Статические объекты/методы известны тем, что препятствуют тестированию. Решение этой проблемы такое же, как и для развязки любого типа статического объекта - введение seam.

Вы используете статический объект для запуска и возвращаете ссылку, Task. Это то, что вы можете определить для role interface. Это может выглядеть примерно так:

public interface ITaskFactory 
{ 
    Task StartNew(Action action); 
} 

С реализацией производства, которая выглядит как:

public class TplTaskFactory : ITaskFactory 
{ 
    public Task StartNew(Action action) 
    { 
     return Task.Factory.StartNew(action); 
    } 
} 

Затем можно использовать инъекции зависимостей для питания вашего SUT с макетом реализации этого интерфейса, который дает Вам которую вы ищете.

0

Тестирование устройства не должно проверять ваши личные методы. Что вы можете сделать, так это изменить функцию на protected и расширить класс в классе тестирования модулей. Затем вы сможете вызвать его непосредственно из теста. Более подробная информация по этому вопросу: Unit testing private methods in C#

Кроме того, если вы хотите, чтобы проверить функцию, помеченную как async, вы можете пометить как async тестовой функции а, а затем продолжить в обычном режиме с await вызова.

Смежные вопросы