модульное тестирование .net с общим параметром абстрактного типа и цепочкой - PullRequest
0 голосов
/ 01 ноября 2010

Каким будет правильный способ модульного тестирования абстрактного класса, который принимает параметр универсального типа, где тип также является абстрактным классом? Например)

public abstract class BaseClass<T> where T : BaseT { ... }

Мне придется создать тестовый класс, который расширяет BaseT, верно ??

и что произойдет, если метод поддержки BaseClass объединится так, что

public abstract class BaseClass<T> where T : BaseClass<T> { ... } ??

спасибо.

обновленный пример конкретного класса для 2-го случая:

    public class ConcreteClass : BaseClass<ConcreteClass>
    {
        public ConcreteClass Method1()
        {
            return this as ConcreteClass;
        }
    }

Ответы [ 3 ]

3 голосов
/ 01 ноября 2010

Вы можете сделать это без реализации фиктивного класса реализации, используя Rhino Mocks: http://www.ayende.com/wiki/Rhino+Mocks+Partial+Mocks.ashx

К сожалению, Rhino Mocks требует использования синтаксиса записи / воспроизведения с частичными имитациями вместо синтаксиса AAA.

Даны следующие абстрактные классы:

public abstract class BaseAbstract
{
    public abstract int Increment();
}

public abstract class AbstractClass<T> where T : BaseAbstract
{
    private int inc;

    public abstract T Abstract();

    public virtual int Concrete()
    {
        return inc += Abstract().Increment();
    }
}

Вы можете проверить реализацию Бетона следующим образом:

[Test]
public void mock_an_abstract_class_with_generic()
{
    var mocks = new MockRepository();
    var baseAbstract = mocks.StrictMock<BaseAbstract>();
    var abstractClass = mocks.PartialMock<AbstractClass<BaseAbstract>>();

    using (mocks.Record())
    {
        baseAbstract.Stub(a => a.Increment()).Return(5);
        abstractClass.Stub(a => a.Abstract()).Return(baseAbstract);
    }

    using (mocks.Playback())
    {
        abstractClass.Concrete().ShouldEqual(5);
        abstractClass.Concrete().ShouldEqual(10);
    }
}

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

Недостатком этого является, очевидно, требование к синтаксису записи / воспроизведения. Я не знаю, могут ли другие фреймворки помочь вам в этом, но я обычно обнаружил, что Rhino Mocks - это фреймворк, к которому вы обращаетесь, если у вас есть такой продвинутый вариант использования.

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

Не зная больше деталей, я предполагаю, что вы пытаетесь протестировать некоторый код, который реализован в абстрактном обобщенном классе. Например, вы можете протестировать открытый метод или свойство, которое реализовано в базовом классе и не помечено как абстрактное.

Итак, вам нужно будет создать класс, который расширяет базовый базовый класс BaseClass и другой класс, который расширяет BaseT. Давайте назовем эти ConcreteClass и ConcreteT соответственно.

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

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

Нет способа протестировать абстрактный класс, вы не можете создать экземпляр:)

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