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





Многие мои тесты вращаются вокруг загрузки объекта, который (например, 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);
}
}
}