Я пытаюсь научить некоторых людей пользоваться реальными модульными тестами, поскольку большинство их автоматизированных тестов являются интеграционными.
Для этого я хочу реорганизовать класс, чтобы я мог тестировать его изолированно, без его зависимостей.
Для этого у меня есть следующие ограничения:
1. Я не могу использовать какие-либо фальшивые фреймворки, поэтому для этого мне нужно создать собственные макеты.
2. Я не могу изменить класс, который будет проверен, чтобы изменить какие-либо частные методы на защищенные или публичные, или изменить методы на виртуальные, чтобы я не мог наследовать от этого класса и переопределить методы.
Итак, в методе, который я хочу проверить, у меня есть следующее выражение using:
using(myObject.CreateScope())
{
.... do something
}
Пока что я планирую сделать:
1. Извлеките интерфейс из класса myObject.
2. Введите интерфейс в SUT, используя свойство.
Конечно, метод «CreateScope» будет частью интерфейса, который определяется следующим образом:
public IDisposable CreateScope();
Так что на моем собственном макете я хотел бы сделать что-то вроде:
public IDisposable CreateScope()
{
return new AnyDisposableObject();
}
Мой вопрос будет:
Учитывая, что сообщение о том, что тестирование классов в изоляции дает множество преимуществ, которые не могут получить интегрированные тесты, каков был бы наименее болезненный и ясный способ реализации метода "CreateScope" в пользовательском макете?
Должен ли я создать пустой поддельный объект, единственная цель которого - реализовать IDisposable?
Должен ли я использовать какой-либо объект из .Net Framework, который реализует IDisposable?
Есть ли лучший способ, чем два варианта выше?
Заранее спасибо.
ОБНОВЛЕНИЕ : Ради ясности
using(myObject.CreateScope())
{
var local = parameter.Where(o => !myObject.Contains(o)).Select(o).ToList();
...
myObject.Register(newInstance);
...
return myObject.GetList();
}
Я буду проверять логику в выражении «using». Объект myObject будет использоваться для предоставления значений при вызове методов, которые их возвращают, или пустых методов для пустых. Метод CreateScope делает блокировку в защищенном словаре, но мне не интересно тестировать эту функциональность с этим.
Надеюсь, это проясняет намерение.