Юнит тестирование уровней классов с помощью Nunit и Nmock

У меня есть уровни классов и интерфейсов, а именно Level1, Level2 а также Level3,
Учебный класс Level1 зависит от класса Level2 и класс Level2 зависит от класса Level3,

Вот код для этого дизайна:

public interface ILevel1
{
    string GetData();
}

public class Level1 : ILevel1
{
    ILevel2 level2;
    public Level1(ILevel2 level2)
    {
        this.level2 = level2;
    }

    public string GetData()
    {
        // some more process on data.
        var data = level2.GetDataAndProc();
        data = data + ",Proc at Level1";
        return data;
    }
}

public interface ILevel2
{
    string GetDataAndProc();        
}

public class Level2 : ILevel2
{    
    ILevel3 level3;
    public Level2(ILevel3 level3)
    {
        this.level3=level3;
    }

    public string GetDataAndProc()
    {
        var data=level3.GetDataFromDB();
        // processing on the data from db.
        data=data+ " Processed at level2";
        return data;
    }
}

public interface ILevel3
{
    string GetDataFromDB();
}

public class Level3 : ILevel3
{
   public string GetDataFromDB()
   {
       // Functionalities to get data from db.
       return "DB Data";
   }
}

Теперь я могу тестовый класс Level1 в изоляции насмешки Level2 интерфейс и класс модульных испытаний Level2 в изоляции насмешки Level3 интерфейс. я использую Nunit в качестве основы тестирования и NMock в качестве насмешливой основы.

Все идет нормально.

Но могу ли я тестировать модуль только на первых двух уровнях Level3интерфейс без насмешекLevel2? Я имею в виду, я хочу пройти тестовый класс Level1 без насмешек Level2 но насмешливый Level3, Я хотел сделать это, потому что Level3 класс получает данные из БД, и я хочу смоделировать только этот слой БД, чтобы весь мой проект работал только с фиктивной БД, а не с реальной БД.

1 ответ

Решение

Это просто:

// arrange
var mocks = new Mockery();
var mockLevel3 = mocks.NewMock<ILevel3>();
// now do some actual mocking here

var level2 = new Level2(mockLevel3);
var level1 = new Level1(level2);

// now do some act and assert stuff

На мой взгляд, это интеграционный тест. На этом этапе не имеет значения, все ли классы находятся в одной сборке. Интеграционные тесты не обязательно сводятся к объединению некоторых сборок в тесте.

Другие вопросы по тегам