В моих модульных тестах 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 Team System для модульного тестирования. Возможно, это должна быть вики сообщества, если она слишком субъективна.
Редактировать: Сейчас я использую решение, основанное на предложении Авиад П., а также на том факте, что следующий тест пройден:
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()
);