Это моя первая попытка провести единичные тесты, поэтому, пожалуйста, будьте терпеливы со мной. Я все еще пытаюсь использовать unit test библиотеку, которая преобразует списки POCOs в 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();
Мне тоже это не нравится, потому что это в основном дублирование некоторых из кода в реальном методе конверсии (тестируемый метод), что еще одно, чего следует избегать в тестах.
Итак... что я могу сделать сейчас?
Является ли этот уровень дублирования по-прежнему приемлемым в этой особой ситуации или есть лучший способ проверить это?