如何在C#中单元测试Textrenderer.DrawText方法

时间:2015-08-04 12:37:01

标签: c# unit-testing

public static void DrawText(IDeviceContext dc, string text, Font font, Point pt, Color foreColor, TextFormatFlags flags);

我有一个针对我的ExtendedComboBox的测试器应用程序。 以下代码中给出的所有String项目都存在于我的测试器应用程序中的ComboBox项目中。如何对上述方法进行单元测试,因为它返回void? 测试TextRenderer.Drawtext的另一种方法是什么?是否有任何替代测试OnDrawItem方法来绘制ComboBox文本。

[TestMethod()]
public void ExtendedComboBoxOnDrawPrefixTest()
{
    ExtendedComboBox cboTest = new ExtendedComboBox ();

    // List of strings having special characters.

    string[] items = { 
        "&One",
        "T&wo",
        "E!xclamation",
        "Am@persat",
        "H#ash",
        "Dollar$Sign",
        "Perc%ent",
        "Ci^rcumflex",
        "Ast*erisk",
        "Hy-phen",
        "Und_erscore",
        "pl+us",
        "Equ=als",
        "Col:on",
        "Semi;colon",
        "Co'mma",
        "Inverted\"Comma",
        "Apos'trophe",
        "Pip|e",
        "Open{Brace",
        "Close}Brace",
        "OpenBr[acket",
        "CloseBr]acket",
        "BackS\\lash",
        "ForwardSl/ash",
        "LessT<han",
        "Greate>rThan",
        "Questio?nMark",
        "Do.t",
        "Three",
        "Four",
        "Five",
        "Six",
        "This is a really extremely long string value for a combobox to display."
    };

    cboTest.Items.AddRange(items);

    // To test that all the items have the same kind of prefixes
    for (int index = 0; index < cboTest.Items.Count; index++)
    {
        String expectedText = GetExtendedComboBoxText(cboTest, items[index]);
        Assert.AreEqual(items[index], , String.Format("Item '{0}' returned an string", cboTest.Items[index]));
    }
}

/// <summary>
/// Compare the ComboBoxText of the passed string with respect to the DC, Font, ForeColor and TextFormatFlags.
/// Draw the item 
/// </summary>
private string GetExtendedComboBoxText(Control cboTest, string itemToTest)
{
    TextFormatFlags textFormatflags = TextFormatFlags.NoPrefix;
    Color foreColor = SystemColors.HighlightText;
    return (TextRenderer.DrawText(cboTest.CreateGraphics(), itemToTest, cboTest.Font, new Point(cboTest.Bounds.X, cboTest.Bounds.Y), foreColor, textFormatflags)).Text;
}

1 个答案:

答案 0 :(得分:8)

它是BCL方法,您不应该验证BCL方法的行为。

在UTs中有一个假设; BCL的方法和类正常工作。如果您验证了BCL的方法,那么您必须验证intbyteToString()等的行为...(因为您可以&#39;相信你的基础设施)

您不应该验证BCL类的行为(Microsoft已经为您完成了......)。实际上,您应该假设该方法正常工作(而不是验证它),然后验证您正在使用具有正确参数的方法。

为了帮助我的开发人员,我创建了一个流程图,演示了当他们遇到这样的问题时如何采取行动:(在我们的R&amp; D中,我们发现它非常实用。我们喜欢它影响我们研发的方式。 ..)

enter image description here

在您的情况下,似乎预期的行为是可见的,因此您可以通过UI验证它作为验收/集成/组件测试的一部分......

如果您仍想将其验证为UT并且您的测试框架不允许您验证(Rhino MocksMoq等)此方法,则应该包装该方法或使用其他工具测试方法,例如MsFakesTypemock Isolator等......

以下代码段演示了使用MsFakes设置方法预期的方法:

    [TestMethod]
    public void PutExpectationOnDrawText()
    {
        var wasExcute = false;
        System.Windows.Forms.Fakes.ShimTextRenderer
                      .DrawTextIDeviceContextStringFontRectangleColorTextFormatFlags =
            (context, txt, font, pt, forecolor, flags) =>
            {
                //the asserts on the orguments...
                //for example:
                Assert.IsNotNull(context);
                Assert.AreNotEqual(String.Empty, txt);
                //...
                wasExcute = true;
            };


        //execute the method which is use DrawText


        Assert.IsTrue(wasExcute);//verify that the method was execute....
    }