13

我喜欢将我的 Assert.AreEqual 扩展到许多不同的类,已知的当然是 CollectionAssert,但我可以想到更多,例如:ImageAssert、 XmlAssert 等。

您是否创建了自己的 Assert 类?你想创造什么样的新事物?

4

5 回答 5

5

这就是我的解决方案:

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);
        }
    }
}
于 2012-08-03T11:53:44.007 回答
4

我喜欢 Assert 类的感觉,但想要更多用作通用验证框架的东西。我从 Roger Alsing 关于使用扩展方法的文章开始,现在有一个系统,其工作方式如下:

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 位于根目录,因此很容易获得。

于 2008-12-19T16:48:11.770 回答
0

我的许多测试都围绕着加载一个具有已知良好状态的对象(如切割路径)。执行测试,然后将结果与加载的对象进行比较。如果它们不同,那么“发生”某些事情会导致代码发生变化。

这种方法可以节省大量时间,并允许在需要时进行自定义比较。

于 2008-12-19T16:46:04.643 回答
0

我认为,如果您重构测试以减少重复,那么您最终会创建自己的框架作为副产品,当然您的测试框架将拥有在您的上下文中有意义的断言助手。

我想到的一个例子是,在测试 xhtml 报告时,我们最终得到的测试看起来像:

  assertCoverageEquals(45.5);

断言覆盖的背后是这样的:

  assertPercentage(COVERAGE_ID, 45.5);

然后后面是使用 xpath 获取值的方法和另一种知道百分比格式的方法。

于 2008-12-20T06:42:52.800 回答
0

正如我在上面写的那样(在我的问题中),我刚刚向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));
    }
}
于 2008-12-21T23:01:48.363 回答