#c# #fluent-assertions
#c# #беглые утверждения
Вопрос:
Я хочу проверить, что значение элемента XML содержит определенную строку. [Приведенный ниже код явно сильно надуман и не из реальной кодовой базы, над которой я работаю]. Как проверить с помощью беглых утверждений, что значение элемента XElement содержит строку?
using System.Xml.Linq;
using FluentAssertions;
class Program
{
private static void Main()
{
var x = new XElement("Root", new XElement("Name", "Fat Cat Sat"));
x.Should().HaveElement("Name").Which.Should().HaveValue("Fat Cat Sat");
// don't know how to do this:
x.Should().HaveElement("Name").Which.Should().HaveValueContaining("Cat");
}
}
Ответ №1:
Значение вашего XML-узла — это просто строка, наличие нескольких «записей», разделенных пробелами, не является чем-то особенным в XML, поэтому нам нужно рассматривать это утверждение как обычную строку.
x.Should().HaveElement("Name").Which.Value.Split(' ').Should().Contain("Cat");
Важным отличием здесь является .Which.Value
то, что мы утверждаем только значение узла (который является строкой), а не всего узла. Оттуда вы можете разделить пробелами, а затем проверить, содержит ли результирующая коллекция одну из записей, которые вы ищете.
Ответ №2:
Плавные утверждения могут быть расширены, поэтому вы можете добавить метод расширения, который проверяет, содержится ли текст в значении:
public static class FluentExtensions {
public static AndConstraint<XElementAssertions> HaveValueContaining(this XElementAssertions element, string text) {
{
Execute.Assertion
.ForCondition(element.Subject.Value.Contains(text))
.FailWith($"Element value does not contain '{text}'");
return new AndConstraint<XElementAssertions>(element);
}
}
}
Тогда этот тест пройдет:
[Test]
public void Test() {
var x = new XElement("Root", new XElement("Name", "Fat Cat Sat"));
x.Should().HaveElement("Name").Which.Should().HaveValue("Fat Cat Sat");
x.Should().HaveElement("Name").Which.Should().HaveValueContaining("Cat");
x.Should().HaveElement("Name").Which.Should().HaveValueContaining("Cat Sat");
}
И этот тест завершится неудачей:
[Test]
public void Test() {
var x = new XElement("Root", new XElement("Name", "Fat Cat Sat"));
x.Should().HaveElement("Name").Which.Should().HaveValue("Fat Cat Sat");
x.Should().HaveElement("Name").Which.Should().HaveValueContaining("Cat Mat");
}
Значение элемента не содержит ‘Cat Mat’