如何测试单元测试中是否显示消息框?

How do I test did a message box shows up or not in unit testing?

我想测试一下,当我的代码请求时,消息框会出现吗?但我不太确定该断言什么,或者我什至在做正确的事。

public void btnSave_Click(object sender, EventArgs e)
        {
            if(txtFirstName.Text.Trim() != "" && txtLastName.Text.Trim() != "" && txtContact.Text.Trim() != "")
            {
                Regex reg = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$"); // Only accepting proper email
                Match match = reg.Match(txtEmail.Text.Trim());
                if (match.Success)
                { using (SqlConnection sqlCon = new SqlConnection(connectionString)) // Connecting info to database
                    {
                        sqlCon.Open();
                        SqlCommand sqlCmd = new SqlCommand("ContactAddorEdit", sqlCon);
                        sqlCmd.CommandType = CommandType.StoredProcedure;
                        sqlCmd.Parameters.AddWithValue("@PhoneBookID", PhoneBookID); //connecting each value to database
                        sqlCmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text.Trim());
                        sqlCmd.Parameters.AddWithValue("@LastName", txtLastName.Text.Trim());
                        sqlCmd.Parameters.AddWithValue("@Contact", txtContact.Text.Trim());
                        sqlCmd.Parameters.AddWithValue("@Email", txtEmail.Text.Trim());
                        sqlCmd.Parameters.AddWithValue("@Address", txtAddress.Text.Trim());
                        sqlCmd.ExecuteNonQuery(); // Executing the query in database
                        MessageBox.Show("Submitted successfully"); // Showing message when success
                        Clear(); // Clearing the form
                        GridFill();// Refreshing the table
                    }
                }
                else
                {
                    MessageBox.Show(" Please enter a valid Email"); // Showing message when email is not valid
                }
            }
            else
            {
                MessageBox.Show("Please fill Mandatory fields"); // If no input this message will show
            }

        }

因此,如果文本框得到一个空字符串,则会弹出一个消息框并显示 "Please fill Mandatory fields"

这是我正在尝试编写的测试

        [TestMethod]
        public void TestMethod1()
        {
            Form1 form1 = new Form1();
            form1.txtFirstName.Text = "";
            Assert.IsTrue(MessageBox.Show("Please fill Mandatory fields") ;
        }

应该使用什么样的断言,我该如何编写?我可以这样测试吗?谢谢

您不使用单元测试来测试用户界面。它们用于测试逻辑。单元测试无法单击按钮(当您的消息框弹出时谁或什么会单击“确定”以便测试可以完成?)有 UI 个测试框架可以。

想想你要在这里测试什么。 Test1 正在测试表单是否会正确检查必填字段是否已填写。为该逻辑创建一个方法,并对其进行单元测试:

public bool MandatoryFieldsArePopulated()
{
     return txtFirstName.Text.Trim() != "" 
         && txtLastName.Text.Trim() != "" 
         && txtContact.Text.Trim() != "";
}

这可以很容易地通过单元测试进行测试。然后 btnSave_Click 方法的第一行将是

if (MandatoryFieldsArePopulated())

像这样构建代码不仅可以让您单独测试逻辑单元,还可以使代码更清晰易读。