В моих модульных тестах C# я часто запрашиваю для списка строк на основе списка идентификаторов. Я затем хочу удостовериться это 1) для всех идентификаторов, была по крайней мере одна строка, найденная, что это имеет тот идентификатор и 2) для всех возвращенных строк, каждая строка имеет идентификатор, который находится в списке идентификаторов для нахождения. Вот то, как я обычно удостоверяюсь что:
Assert.IsTrue(ids.All(
id => results.Any(result => result[primaryKey].Equals(id))
), "Not all IDs were found in returned results");
Assert.IsTrue(results.All(
result => ids.Any(id => result[primaryKey].Equals(id))
), "Returned results had unexpected IDs");
Я думаю использование Any
и All
удобно для таких проверок, но я хотел видеть, думает ли кто-либо, что это менее читаемо, чем это могло бы быть, или если существует, возможно, более хороший способ сделать двухсторонние проверки как это. Я использую MSTest в системе Visual Studio 2008 Команды для поблочного тестирования. Это, возможно, должно быть общественной Wiki, если это слишком субъективно.
Править: Я теперь использую решение на основе Aviad P. 's предложение и также то, что следующий тест передает:
string[] ids1 = { "a", "b", "c" };
string[] ids2 = { "b", "c", "d", "e" };
string[] ids3 = { "c", "a", "b" };
Assert.AreEqual(
1,
ids1.Except(ids2).Count()
);
Assert.AreEqual(
2,
ids2.Except(ids1).Count()
);
Assert.AreEqual(
0,
ids1.Except(ids3).Count()
);
Вы можете использовать оператор За исключением
:
var resultIds = results.Select(x => x[primaryKey]);
Assert.IsTrue(resultIds.Except(ids).Count() == 0,
"Returned results had unexpected IDs");
Assert.IsTrue(ids.Except(resultIds).Count() == 0,
"Not all IDs were found in returned results");
IMO, не так читабельно, как это может быть. Создать и задокументировать метод, возвращающий true / false. Затем вызвать Assert.IsTrue(методWithDescriptiveNameWhichReturnsTrueOrfalse(), "причина ошибки");
.NUnit имеет CollectionAssert
семейство утверждений, которые помогают читабельности.