Как утверждать IEnumerable

#c# #string #ienumerable #assert

#c# #строка #ienumerable #утверждать

Вопрос:

Мне интересно, является ли этот подход лучшим для утверждения строкового значения IEnumerable, можете ли вы подсказать мне, как я могу утверждать это, чтобы вернуть некоторое содержимое во всей строке? Спасибо.

 [CodeStep("Assert message")]
public void Test()
{
   var client = new HttpClient();
   client.BaseAddress = new Uri("URLHere");
   var response = string.Empty;
   Task.Run(async () =>
   {
       response = await client.GetStringAsync("message/All");
   }).Wait();

   var messages = JsonConvert.DeserializeObject<IEnumerable<string>>(response);
   Assert.IsTrue(messages.ToString().Contains("TextHere"));
}
  

Комментарии:

1. Почему вы вызываете ToString() an IEnumerable<string> ?

2. Пожалуйста, отправьте код, а не изображение кода. Также включите детали, подобные тому, что есть Assert . В большинстве библиотек утверждений есть способ определить, содержит ли коллекция элемент.

3. Это должно быть либо messages?.Contains("TextHere") для определения messages , содержит ли значение «TextHere», либо messages должно быть an IEnumerable<char> . Неясно, что на самом деле возвращается из HTTP-вызова.

4. An IEnumerable<string> — это не одна строка, а способ получить целую кучу строк (потенциально). Это несколько похоже на список или массив, но там, где это полностью реализованные структуры данных в памяти, перечисляемый больше похож на способ получить следующий элемент, а затем следующий и следующий и так далее. — итак, вопрос в том, что вы действительно хотите утверждать об этом? Что он создает какой- либо элемент? Это вы можете просто сделать messages.Any() . Или вы хотите проверить, является ли один элемент точным "TextHere" ? тогда вы можете сделать messages.Contains("TextHere") .

5. Или, может быть, вы хотите аналогичный поиск? Тогда вы могли бы сделать messages.Any(item => item.Contains("TextHere"))

Ответ №1:

Нет, это не лучший способ проверить, что одно из сообщений содержит слово TextHere . Для базовой последовательности не требуется отображать ее содержимое как часть ToString , и на самом деле реализация, подобная List<> do, этого не делает.

Попробуйте Contains вместо этого использовать метод расширения Linq:

Assert.IsTrue(messages.Contains("TextHere"));

Если вы хотите проверить, содержит ли какая-либо строка подстроку TextHere , используйте Any :

Assert.IsTrue(messages.Any(t => t.Contains("TextHere")));

Комментарии:

1. И перечисляемый. SequenceEqual, если вы знаете, какой должна быть вся последовательность.