Создать метод, который возвращает IDisposable в пользовательском макете класса - PullRequest
5 голосов
/ 23 августа 2011

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

Для этого я хочу реорганизовать класс, чтобы я мог тестировать его изолированно, без его зависимостей.

Для этого у меня есть следующие ограничения:
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 делает блокировку в защищенном словаре, но мне не интересно тестировать эту функциональность с этим.

Надеюсь, это проясняет намерение.

1 Ответ

2 голосов
/ 23 августа 2011

Попробуйте следующий объект Mock, который реализует IDisposable:

class MockDisposable : IDisposable
{
    bool _disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed) // only dispose once!
        {
            if (disposing)
            {
                // Not in destructor, OK to reference other objects
            }
            // perform cleanup for this object
        }
        _disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);

        // tell the GC not to finalize
        GC.SuppressFinalize(this);
    }

    ~MockDisposable()
    {
        Dispose(false);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...