двухстороннее сравнение списка в модульном тесте C#

В моих модульных тестах 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()
);
5
задан Sarah Vessels 4 January 2010 в 22:12
поделиться

3 ответа

Вы можете использовать оператор За исключением :

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");
4
ответ дан 14 December 2019 в 04:39
поделиться

IMO, не так читабельно, как это может быть. Создать и задокументировать метод, возвращающий true / false. Затем вызвать Assert.IsTrue(методWithDescriptiveNameWhichReturnsTrueOrfalse(), "причина ошибки");

.
3
ответ дан 14 December 2019 в 04:39
поделиться

NUnit имеет CollectionAssert семейство утверждений, которые помогают читабельности.

0
ответ дан 14 December 2019 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: