Как делают Вас модульный тест интерфейс?

Например, существует интерфейс IMyInterface, и три класса поддерживают этот интерфейс:

class A : IMyInterface
{
}

class B : IMyInterface
{
}

class C : IMyInterface
{
}

Самым простым способом я мог записать три тестовых класса: ATest, опытная эксплуатация, CTest и тестируют их отдельно. Однако, так как они поддерживают тот же интерфейс, большая часть тестового кода была бы тем же, трудно поддержать. Как я могу использовать простой и легкий способ протестировать интерфейс, который поддерживается другим классом?

(ранее спрошенный относительно форумов MSDN)

24
задан Shog9 25 June 2010 в 22:32
поделиться

4 ответа

Чтобы протестировать интерфейс с помощью общих тестов независимо от реализации, вы можете использовать абстрактный тестовый пример, а затем создать конкретные экземпляры тестового примера для каждой реализации интерфейса.

Абстрактный (базовый) тестовый пример выполняет тесты, не зависящие от реализации (т. Е. Проверяет контракт интерфейса), в то время как конкретные тесты заботятся о создании экземпляра объекта для тестирования и выполняют любые тесты, зависящие от реализации.

20
ответ дан 28 November 2019 в 22:36
поделиться

Можно было создавать методы, которые принимают параметр типа IMyInterface, а фактические методы тестирования просто вызывают эти методы, передаваемые в разные конкретные классы.

3
ответ дан 28 November 2019 в 22:36
поделиться

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

2
ответ дан 28 November 2019 в 22:36
поделиться

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

public interface IMyInterface {}
class A : IMyInterface { }
class B : IMyInterface { }
class C : IMyInterface { }

public abstract class BaseTest
{
    protected abstract IMyInterface CreateInstance();

    [Test]
    public void Test1()
    {
        IMyInterface instance = CreateInstance();
        //Do some testing on the instance...
    }

    //And some more tests.
}

[TestFixture]
public class ClassATests : BaseTest
{
    protected override IMyInterface CreateInstance()
    {
        return new A();
    }

    [Test]
    public void TestCaseJustForA()
    {
        IMyInterface instance = CreateInstance();   
        //Do some testing on the instance...
    }

}

[TestFixture]
public class ClassBTests : BaseTest
{
    protected override IMyInterface CreateInstance()
    {
        return new B();
    }
}

[TestFixture]
public class ClassCTests : BaseTest
{
    protected override IMyInterface CreateInstance()
    {
        return new C();
    }
}
41
ответ дан 28 November 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: