Как реализовать XUnit описательное сообщение Assert?

контекст

в XUnit github Я нашел это: добавьте пересылку Assert.Equal (ожидаемый, фактический, сообщение) № 350 (чтобы разработчик попросил не существующую перегрузку, см. ниже)

Цитата из ответа:

Мы верим в самодокументирующийся код; который включает ваши утверждения.

(поэтому команда XUnit отвергает это)

Ладно, я понял. Я также считаю, что сам документирующий код. Тем не менее я не могу узнать этот прецедент:

Образец

// Arrange
// Create some external soap service client and its wrapper classes

// Act
// client.SomeMethod();

// Assert
// Sorry, soap service interface, behaviour and design is *given*
// So I have to check if there is no Error, and 
// conveniently if there is, then I would like to see it in the assertion message

Assert.Equal(0, client.ErrorMessage.Length); // Means no error

// I would like to have the same result what would be the following *N*U*n*i*t* assert:
// Assert.AreEqual(0, client.ErrorMessage.Length, client.ErrorMessage); // Means no error

Вопрос

Как я могу реализовать описательное сообщение assert в этом случае в XUnit, который до сих пор не имеет такой перегрузки?

Ответы

Ответ 1

Используйте предложения, указанные по ссылке. Подобно свободным утверждениям или создайте собственное утверждение, которое обертывает Assert.True or Assert.False которые остались с перегрузками сообщений. Это было указано ниже

котировка

Вы можете предоставить сообщения Assert.True и.False. Если вы просто не можете жить без сообщений (и отказываться использовать другое утверждение), вы всегда можете вернуться к:

Assert.True(number == 2, "This is my message");

Цитата:

Если вы действительно хотите иметь сообщения, вы можете добавить Fluent Assertions или, возможно, xbehave к вашим тестовым проектам и использовать их синтаксис. Свободные утверждения даже бросают исключения xunit.net, если они сталкиваются с его присутствием.

Ответ 2

У меня была такая же проблема. У меня есть тест, который извлекает данные из двух веб-API, а затем сравнивает и утверждает различные вещи о контенте. Я начал использовать стандартные утверждения XUnit, такие как:

Assert.Equal(HttpStatusCode.OK, response1.StatusCode);
Assert.Equal(HttpStatusCode.OK, response2.StatusCode);

Но хотя это дает полезное сообщение о том, что 404 был возвращен, из журналов на нашем сервере build/CI не ясно, какая служба вызвала сообщение об ошибке.

Я закончил тем, что добавил свое собственное утверждение, чтобы дать контекст:

public class MyEqualException : Xunit.Sdk.EqualException
{
    public MyEqualException(object expected, object actual, string userMessage)
        : base(expected, actual)
    {
        UserMessage = userMessage;
    }

    public override string Message => UserMessage + "\n" + base.Message;
}

public static class AssertX
{
    /// <summary>
    /// Verifies that two objects are equal, using a default comparer.
    /// </summary>
    /// <typeparam name="T">The type of the objects to be compared</typeparam>
    /// <param name="expected">The expected value</param>
    /// <param name="actual">The value to be compared against</param>
    /// <param name="userMessage">Message to show in the error</param>
    /// <exception cref="MyEqualException">Thrown when the objects are not equal</exception>
    public static void Equal<T>(T expected, T actual, string userMessage)
    {
        bool areEqual;

        if (expected == null || actual == null)
        {
            // If either null, equal only if both null
            areEqual = (expected == null && actual == null);
        }
        else
        {
            // expected is not null - so safe to call .Equals()
            areEqual = expected.Equals(actual);
        }

        if (!areEqual)
        {
            throw new MyEqualException(expected, actual, userMessage);
        }
    }
}

Тогда я могу сделать те же утверждения, что и:

AssertX.Equal(HttpStatusCode.OK, response1.StatusCode, $"Fetching {Uri1}");
AssertX.Equal(HttpStatusCode.OK, response2.StatusCode, $"Fetching {Uri2}");

и журнал ошибок дает фактическое, ожидаемое и добавляет мое сообщение о том, какой веб-интерфейс был виновником.

Я понимаю, что опоздал с ответом, но подумал, что это может помочь другим в поиске практического решения, у которого нет времени для установки/изучения еще одной тестовой среды просто для получения полезной информации о неудачных тестах.