代码之家  ›  专栏  ›  技术社区  ›  ak.

如何测试单击按钮是否打开具有nunitforms的新表单?

  •  4
  • ak.  · 技术社区  · 17 年前

    我刚接触C并尝试用nunit和nunitforms编写一个简单的GUI单元测试。我想测试单击按钮是否打开新表单。 我的应用程序有两个窗体,主窗体(Form1)带有打开新窗体(密码)的按钮:

    private void button2_Click(object sender, EventArgs e)
    {
        Password pw = new Password();
        pw.Show();
    }
    

    我的测试源如下所示:

    using NUnit.Framework;
    using NUnit.Extensions.Forms;
    
    namespace Foobar
    {
        [TestFixture]
        public class Form1Test : NUnitFormTest
        {
            [Test]
            public void TestNewForm()
            {
                Form1 f1 = new Form1();
                f1.Show();
    
                ExpectModal("Enter Password", "CloseDialog");
    
                // Check if Button has the right Text
                ButtonTester bt = new ButtonTester("button2", f1);
                Assert.AreEqual("Load Game", bt.Text);
    
                bt.Click();
            }
            public void CloseDialog()
            {
                ButtonTester btnClose = new ButtonTester("button2");
                btnClose.Click();
            }
        }
    }
    

    nunit输出为:

      NUnit.Extensions.Forms.FormsTestAssertionException : expected 1 invocations of modal, but was invoked 0 times (Form Caption = Enter Password)
    

    按钮文本检查成功。问题是 期望模式 方法。我也用表格的名字试过,但没有成功。

    有人知道可能出了什么问题吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   ak.    17 年前

    我自己想出来的。Windows窗体有两种显示方式:

    • 情态动词 :“在继续处理应用程序的其余部分之前,必须关闭或隐藏模式窗体或对话框。”
    • 无模的 ……允许您在窗体和另一个窗体之间切换焦点,而不必关闭初始窗体。显示表单时,用户可以在任何应用程序的其他位置继续工作。“

    无模式窗口使用show()方法打开,模式窗口使用showdialog()打开。 nunitforms只能跟踪模式对话框 (这也是该方法名为“expectmodal”的原因)。

    我把源代码中的每个“show()”都改为“showdialog()”,nunitforms工作得很好。

        2
  •  0
  •   Stealth Rabbi    15 年前

    如果您希望表单实际作为模式对话框打开,我只会将源代码更改为使用showdialog()。

    您是正确的,因为nunitforms支持“expect modal”,但没有“expect non modal”。您可以使用FormTester类相对轻松地实现这一点。FormTester是一个扩展类,可从NunitForms的最新存储库中获得。传入正在检查的窗体的.name属性的字符串,以查看是否显示该属性。

        public static bool IsFormVisible(string formName)
        {
            var tester = new FormTester(formName);
            var form = (Form) tester.TheObject;
            return form.Visible;
        }