Как вы расширили свой класс Assert

Мне нравится расширять свой Assert.AreEqual на множество разных классов, известным является, конечно, CollectionAssert, но я могу придумать и другие, например: ImageAssert, XmlAssert и т. д.

Вы создали свои собственные классы Assert? а что бы вы хотели создать?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
0
7 676
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Многие мои тесты вращаются вокруг загрузки объекта, который (например, CuttingPath) с заведомо исправным состоянием ... Выполнение теста, а затем сравнение результата с загруженным объектом. Если они различаются, что-то «произошло», что привело к изменению кода.

Такой подход экономит массу времени и позволяет при необходимости настраивать сравнения.

Мне нравится ощущение класса Assert, но я хотел что-то, что служило бы больше в качестве общей структуры проверки. Я начал с статья Роджера Алсинга об использовании методов расширения, и теперь у меня есть система, которая работает примерно так:

Enforce.That(variable).IsNotNull();
Enforce.That(variable).IsInRange(10, 20);
Enforce.That(variable).IsTypeOf(typeof(System.String));
etc.

Если какое-либо принудительное исполнение не удается, генерируется исключение. Я рассматривал возможность рефакторинга, чтобы я мог также включить некритическую оценку, которая не вызывает исключения. Некоторым нравится Check.That как вариант Enforce.That, который возвращает логические значения, но имеет методы расширения с идентичными подписями.

Что мне пока нравится в этом подходе, так это то, что я могу использовать их в своих модульных тестах, а также для решения проблем предварительной и пост-валидации в моем реальном коде без ссылки на сборку Microsoft.VisualStudio.QualityTools.UnitTestFramework. Я помещаю его в свою корневую сборку для своего каркаса приложения, а Enforce находится в корне, поэтому до него очень легко добраться.

Я думаю, что если вы реорганизуете свои тесты, чтобы уменьшить дублирование, вы в конечном итоге создаете свою собственную структуру в качестве побочного продукта, и, конечно же, ваша структура тестирования будет иметь помощников assert, которые имеют смысл в вашем контексте.

Я имел в виду пример: при тестировании отчета xhtml мы получили тесты, которые выглядели примерно так:

  assertCoverageEquals(45.5);

где за покрытием assert было что-то вроде:

  assertPercentage(COVERAGE_ID, 45.5);

а затем за этим было что-то, что использовало xpath для получения значения и другой метод, который знал, каково форматирование для процентов.

Ответ принят как подходящий

Я только что добавил реализацию в ImageAssert, как писал выше (в моем вопросе) Буду рад услышать больше таких образцов

[TestMethod]
public void CompareImagesSize()
{
 Image expected = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\ExpectedImage.png");
 Image actual = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\RhinoDiagram.png");

 Bitmap expectedBitmap = new Bitmap(expected);
 Bitmap actualBitmap = new Bitmap(actual);

 ImageAssert.HasTheSameSize(expectedBitmap, actualBitmap);
}

[TestMethod]
public void CompareTwoSameImagesButWithDifferenExtension()
{
 Image expected = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\Image2.png");
 Image actual = Bitmap.FromFile(@"C:\ShaniData\Projects2008\TddSamples\Output\Image1.jpg");

 Bitmap expectedBitmap = new Bitmap(expected);
 Bitmap actualBitmap = new Bitmap(actual);

 ImageAssert.AreEqual(expectedBitmap, actualBitmap);
}

public class ImageAssert
{
    //public static void MoreMethods(Bitmap expected, Bitmap actual)
    //{
    //    //Compare image extensions
    //    //Compare Thumbnail...
    //}

    public static void HasTheSameSize(Bitmap expected, Bitmap actual)
    {
        if ((expected.Height != actual.Height)
            || (expected.Width != actual.Width))
            HandleFail("ImageAssert.HasTheSameSize", String.Empty);
    }

    public static void AreEqual(Bitmap expected, Bitmap actual)
    {
        for (int i = 0; i < expected.Width; i++)
        {
            for (int j = 0; j < expected.Height; j++)
            {
                Color expectedBit = expected.GetPixel(i, j);
                Color actualBit = actual.GetPixel(i, j);
                if (!expectedBit.Equals(actualBit))
                {
                    HandleFail("ImageAssert.AreEqual", String.Empty, i, j);
                    return;
                }
            }
        }
    }

    internal static void HandleFail(string assertionName, string message, params object[] parameters)
    {
        throw new AssertFailedException(String.Format(assertionName));
    }
}

Это мое решение:

using MyStuff;

using A = Microsoft.VisualStudio.TestTools.UnitTesting.Assert;

namespace Mytestproj.Tests
{
    public static class Assert
    {
        public static void AreEqual(object expected, object actual)
        {
            A.AreEqual(expected, actual);
        }

        // my extension
        public static void AreEqual(MyEnum expected, int actual)
        {
            A.AreEqual((int)expected, actual);
        }

        public static void IsTrue(bool o)
        {
            A.IsTrue(o);
        }

        public static void IsFalse(bool o)
        {
            A.IsFalse(o);
        }

        public static void AreNotEqual(object notExpected, object actual)
        {
            A.AreNotEqual(notExpected, actual);
        }

        public static void IsNotNull(object o)
        {
            A.IsNotNull(o);
        }

        public static void IsNull(object o)
        {
            A.IsNull(o);
        }
    }
}

Другие вопросы по теме