单元测试按钮内的调用函数

马修
private 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(); // executeing 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
        }

这些代码位于表单中的“保存”按钮下,我想在单元测试类中调用它们以测试它们。知道我该怎么办吗?谢谢

斯科特·汉南

首先,祝贺您尝试弄清楚如何编写单元测试。将代码隔离成可测试的单元是一种习惯,它会导致各种伟大的模式。

关于我们如何设置这样的东西,有很多想法,但我要在这里介绍的只是隔离代码以进行测试而无需对代码本身进行太多更改的一些步骤。

我不会就此止步 - 事实上,在阅读和学习更多内容后的短时间内,您可能会掌握一些更好的技术。我觉得有必要指出这一点,因为我在这里描述的是一个步骤,而不是最终目的地。

首先,您可以将 SQL 代码移动到这样的类中:

public class SqlCommands
{
    private readonly string _connectionString;

    public SqlCommands(string connectionString)
    {
        _connectionString = connectionString;
    }

    public void InsertUpdateContact(InsertUpdateContactParameters parameters)
    {
        using (SqlConnection sqlCon = new SqlConnection(_connectionString)) 
        {
            sqlCon.Open();
            SqlCommand sqlCmd = new SqlCommand("ContactAddorEdit", sqlCon);
            sqlCmd.CommandType = CommandType.StoredProcedure;
            sqlCmd.Parameters.AddWithValue("@PhoneBookID", parameters.PhoneBookId); //connecting each value to database
            sqlCmd.Parameters.AddWithValue("@FirstName",parameters.FirstName);
            sqlCmd.Parameters.AddWithValue("@LastName",parameters.LastName);
            sqlCmd.Parameters.AddWithValue("@Contact",parameters.Contact);
            sqlCmd.Parameters.AddWithValue("@Email", parameters.Email);
            sqlCmd.Parameters.AddWithValue("@Address",parameters.Address);
            sqlCmd.ExecuteNonQuery();
        }
    }
}

public class InsertUpdateContactParameters
{
    public int PhoneBookId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Contact { get; set; }
    public string Email { get; set; }
    public string Address { get; set; }
}

作为第一步,您可以SqlCommands在表单中创建的实例,然后调用InsertUpdateContact,传入从表单字段填充的参数。这使您可以为 SQL 代码创建测试,而无需实际打开表单、输入值并按下按钮即可执行这些测试。

对您的 SQL 代码的测试在技术上不是单元测试,因为它与您的数据库对话。这是一个集成测试。但它的外观和功能就像一个单元测试。你要

  • 安排 - 设置一些东西
  • 行动 - 执行你的方法
  • 断言 - 如果您期望的事情发生,则您的测试通过,否则将失败。

对于真正简单的测试,您可以

  • 排列 - 从您的表格中删除与某种模式匹配的所有记录,例如电子邮件地址是“[email protected]”等。
  • Act - 调用您的方法,传入一组值,包括您刚刚删除的同一电子邮件地址。
  • 断言 - 查询您的数据库以确认它包含与您刚刚插入的值匹配的记录。
  • 清理 - 为了更好的衡量,再次运行删除,这样你就不会留下测试记录。

为了使插入和删除更容易,您可以在单元测试项目中放置一个类,如下所示:

static class Sql
{
    public static void ExecuteSql(string connectionName, string sql)
    {
        using (var connection = new SqlConnection(GetConnectionString(connectionName)))
        {
            using (var command = new SqlCommand(sql, connection))
            {
                connection.Open();
                command.ExecuteNonQuery();
            }
        }
    }

    public static T ExecuteScalar<T>(string connectionName, string sql)
    {
        using (var connection = new SqlConnection(GetConnectionString(connectionName)))
        {
            using (var command = new SqlCommand(sql, connection))
            {
                connection.Open();
                return (T)command.ExecuteScalar();
            }
        }
    }

    public static string GetConnectionString(string connectionName)
    {
        return ConfigurationManager.ConnectionStrings[connectionName].ConnectionString;
    }
}

如果您使用的是 .NET Framework,您可以拥有一个 app.config 文件,其中包含如下所示的连接字符串部分:

<connectionStrings>
  <add name="yourDatabaseName" connectionString="whatever your connection string is" 
   providerName="System.Data.SqlClient" />
</connectionStrings>

或者您可以编码它以根据您存储它的方式检索您的连接字符串。

这允许您在测试中编写代码,例如

Sql.ExecuteSql("Your connection name", "SQL to delete records");

或者

var numberOfInsertedRecords = Sql.ExecuteScalar<int>("Your connection name",
    "SELECT COUNT(*) FROM Whatever WHERE ... " 
    + "Replace with criteria that checks for the record you just inserted."

然后在你的测试中你可以说:

Assert.AreEqual(1, numberOfInsertedRecords);

您可能喜欢阅读的其他一些有趣领域是依赖注入、ORM(如实体框架和 NHibernate)和 CQRS。这是一大堆东西,但是如果您刚刚开始编写表单和一些 SQL,并且您已经在考虑单元测试,那么天空就是极限。


这是我几年前写的一篇博客文章感觉过时了 我觉得有必要为我一两年多前写的任何东西道歉。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

单元测试对实例变量函数的调用

在单元测试中调用外部函数

使用 Mockito 进行 Java 单元测试。函数内的函数调用

Mocha 单元测试不调用对象内的函数生成器

单元测试Python:在函数内部模拟函数调用

启动时调用函数时单元测试失败

Jest单元测试,用于链接函数调用

如何对__init __()函数中调用的方法进行单元测试?

检查是否已调用函数,角度单元测试

Clojure单元测试:检查是否调用了函数

单元测试在调用演示者函数后出现 NullPointerException

从ngOnInit调用的Angular 2单元测试函数

如何对调用getJSON的JavaScript函数进行单元测试

C语言的Cmocka单元测试:模拟嵌套函数调用

单元测试MOCHA SINON CHAI(检查调用嵌套函数)

单元测试验证传递给调用的函数

在单元测试中拦截通过 $this 引用的函数调用

禁用按钮的单元测试

单元测试API调用

单元测试 Flink 函数

单元测试WKNavigationDelegate函数

编写仅测试函数是否被调用的单元测试有意义吗?

如何使用phpunit单元测试在已测试类的构造函数中调用的方法

在单元测试中打补丁时,芹菜任务调用的函数没有调用?

对调用所有简单函数的主函数进行单元测试的好方法是什么?

调用参数之一的成员函数时如何对函数进行单元测试

Node JS单元测试-云函数,如何调用内部函数

单元测试用例:期望已经从构造函数中调用了组件函数

笑话单元测试-如何在setTimeout重复函数中通过异步函数进行调用