Беглые утверждения: XElement .Should().HaveValueContaining?

#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’