Юнит тестирование уровней классов с помощью 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
На мой взгляд, это интеграционный тест. На этом этапе не имеет значения, все ли классы находятся в одной сборке. Интеграционные тесты не обязательно сводятся к объединению некоторых сборок в тесте.