#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()
anIEnumerable<string>
?2. Пожалуйста, отправьте код, а не изображение кода. Также включите детали, подобные тому, что есть
Assert
. В большинстве библиотек утверждений есть способ определить, содержит ли коллекция элемент.3. Это должно быть либо
messages?.Contains("TextHere")
для определенияmessages
, содержит ли значение «TextHere», либоmessages
должно быть anIEnumerable<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, если вы знаете, какой должна быть вся последовательность.