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 代码的测试在技术上不是单元测试,因为它与您的数据库对话。这是一个集成测试。但它的外观和功能就像一个单元测试。你要
对于真正简单的测试,您可以
为了使插入和删除更容易,您可以在单元测试项目中放置一个类,如下所示:
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] 删除。
我来说两句