Это моя первая попытка провести модульные тесты, поэтому, пожалуйста, наберитесь терпения.
Я все еще пытаюсь выполнить модульное тестирование библиотеки, которая преобразует списки POCO в ADO.Recordsets .
Сейчас я пытаюсь написать тест, который создает List<Poco>
, преобразует его в набор записей (используя метод, который я хочу протестировать), а затем проверяет, содержат ли они ту же информацию (например, если Poco.Foo == RS.Foo
и так далее ...).
Это POCO:
public class TestPoco
{
public string StringValue { get; set; }
public int Int32Value { get; set; }
public bool BoolValue { get; set; }
}
... и это пока тест (я использую xUnit.net):
[Fact]
public void TheTest()
{
var input = new List<TestPoco>();
input.Add(new TestPoco { BoolValue = true, Int32Value = 1, StringValue = "foo" });
var actual = input.ToRecordset();
Assert.Equal(actual.BoolValue, true);
Assert.Equal(actual.Int32Value, 1);
Assert.Equal(actual.StringValue, "foo");
}
Что мне не нравится в этом, так это три утверждения в конце, по одному на свойство POCO.
Я много раз читал, что несколько утверждений в одном тесте - зло (и я понимаю причины, по которым я согласен).
Проблема в том, как я могу от них избавиться?
У меня есть превосходная книга Роя Ошерова "Искусство модульного тестирования" прямо передо мной, и у него есть пример, который охватывает именно это (для тех, у кого есть книга: глава 7.2 .6, стр. 202/203) :
В его примере тестируемый метод возвращает объект AnalyzedOutput
с несколькими свойствами, и он хочет установить все свойства, чтобы проверить, содержит ли каждое из них ожидаемое значение.
Решение в этом случае:
Создайте другой экземпляр AnalyzedOutput
, заполните его ожидаемыми значениями и подтвердите, равен ли он возвращаемому тестируемому методу (и переопределите Equals()
, чтобы иметь возможность сделать это).
Но я думаю, что я не могу сделать это в моем случае, потому что метод, который я хочу проверить, возвращает ADODB.Recordset
.
И чтобы создать еще один Recordset
с ожидаемыми значениями, мне сначала нужно создать его полностью с нуля:
// this probably doesn't actually compile, the actual conversion method
// doesn't exist yet and this is just to show the idea
var expected = new ADODB.RecordsetClass();
expected.Fields.Append("BoolValue", ADODB.DataTypeEnum.adBoolean);
expected.Fields.Append("Int32Value", ADODB.DataTypeEnum.adInteger);
expected.Fields.Append("StringValue", ADODB.DataTypeEnum.adVarWChar);
expected.AddNew();
expected.BoolValue = true;
expected.Int32Value = 1;
expected.StringValue = "foo";
expected.Update();
Мне это тоже не нравится, потому что это в основном дублирование некоторого кода в реальном методе преобразования (тестируемый метод), что является другой вещью, которую следует избегать в тестах.
Итак ... что мне теперь делать?
Этот уровень дублирования все еще приемлем в этой особой ситуации, или есть лучший способ как это проверить?