C# insert命令的单元测试
我是单元测试新手,需要在代码中测试insert命令。谁能告诉我怎么做。。下面是我想测试的方法C# insert命令的单元测试,c#,mysql,sql,database,unit-testing,C#,Mysql,Sql,Database,Unit Testing,我是单元测试新手,需要在代码中测试insert命令。谁能告诉我怎么做。。下面是我想测试的方法 public void InsertData() { Connect(); query = "Insert into Person values ('"+ name +"','"+ address +"','"+ phn +"')"; cmd = new SqlCommand
public void InsertData()
{
Connect();
query = "Insert into Person values ('"+ name +"','"+ address +"','"+
phn +"')";
cmd = new SqlCommand(query, Conn);
cmd.ExecuteNonQuery();
DisConnect();
}
目前,您的方法是不可测试的。应避免所有对真实数据的引用 这将是一种重构方法:
public interface IDbContext
{
void Connect();
void DisConnect();
IDbCommand GetDbCommand(string query, string[] parameters);
}
public class DbContext : IDbContext
{
public IDbConnection Conn { get; set; }
public void Connect()
{
// your code here
}
public void DisConnect()
{
// your code here
}
public IDbCommand GetDbCommand(string query, string[] parameters)
{
// parameter handling
return new SqlCommand(query, (SqlConnection)Conn);
}
}
public class YourClass
{
private string name;
private string address;
private string phn;
public void InsertData(IDbContext context)
{
context.Connect();
var cmd = context.GetDbCommand("Insert into Person values ('{0}','{1}','{2}')", new string[] { name, address, phn });
cmd.ExecuteNonQuery();
context.DisConnect();
}
}
要测试这一点,您可以使用以下方法:
[TestClass]
public class TestClass
{
[TestMethod]
public void TestMethod1()
{
var instance = new YourClass();
// create an instance of IDbContext
var context = new Mock<IDbContext>();
// create an instance of IDbCommand
var command = new Mock<IDbCommand>();
// setup your context and what should be the return of any method you want
context.Setup(c => c.GetDbCommand(It.IsAny<string>(), It.IsAny<string[]>())).Returns(command.Object);
// call your method you want to test
instance.InsertData(context.Object);
// assert that context methods ar called
context.Verify(c => c.Connect(), Times.Once);
context.Verify(c => c.DisConnect(), Times.Once);
context.Verify(c => c.GetDbCommand(It.IsAny<string>(), It.IsAny<string[]>()), Times.Once);
// assert that command methods ar called
command.Verify(c => c.ExecuteNonQuery(), Times.Once);
}
}
[TestClass]
公共类TestClass
{
[测试方法]
公共void TestMethod1()
{
var instance=newyourclass();
//创建IDbContext的实例
var context=newmock();
//创建IDB命令的实例
var命令=new Mock();
//设置您的上下文以及您想要的任何方法的返回应该是什么
Setup(c=>c.GetDbCommand(It.IsAny(),It.IsAny()).Returns(command.Object);
//调用要测试的方法
InsertData(context.Object);
//断言上下文方法已被调用
验证(c=>c.Connect(),Times.Once);
验证(c=>c.DisConnect(),次.Once);
Verify(c=>c.GetDbCommand(It.IsAny(),It.IsAny()),Times.Once);
//断言命令方法已被调用
Verify(c=>c.ExecuteNonQuery(),Times.Once);
}
}
目前,您的方法不可测试。应避免所有对真实数据的引用
这将是一种重构方法:
public interface IDbContext
{
void Connect();
void DisConnect();
IDbCommand GetDbCommand(string query, string[] parameters);
}
public class DbContext : IDbContext
{
public IDbConnection Conn { get; set; }
public void Connect()
{
// your code here
}
public void DisConnect()
{
// your code here
}
public IDbCommand GetDbCommand(string query, string[] parameters)
{
// parameter handling
return new SqlCommand(query, (SqlConnection)Conn);
}
}
public class YourClass
{
private string name;
private string address;
private string phn;
public void InsertData(IDbContext context)
{
context.Connect();
var cmd = context.GetDbCommand("Insert into Person values ('{0}','{1}','{2}')", new string[] { name, address, phn });
cmd.ExecuteNonQuery();
context.DisConnect();
}
}
要测试这一点,您可以使用以下方法:
[TestClass]
public class TestClass
{
[TestMethod]
public void TestMethod1()
{
var instance = new YourClass();
// create an instance of IDbContext
var context = new Mock<IDbContext>();
// create an instance of IDbCommand
var command = new Mock<IDbCommand>();
// setup your context and what should be the return of any method you want
context.Setup(c => c.GetDbCommand(It.IsAny<string>(), It.IsAny<string[]>())).Returns(command.Object);
// call your method you want to test
instance.InsertData(context.Object);
// assert that context methods ar called
context.Verify(c => c.Connect(), Times.Once);
context.Verify(c => c.DisConnect(), Times.Once);
context.Verify(c => c.GetDbCommand(It.IsAny<string>(), It.IsAny<string[]>()), Times.Once);
// assert that command methods ar called
command.Verify(c => c.ExecuteNonQuery(), Times.Once);
}
}
[TestClass]
公共类TestClass
{
[测试方法]
公共void TestMethod1()
{
var instance=newyourclass();
//创建IDbContext的实例
var context=newmock();
//创建IDB命令的实例
var命令=new Mock();
//设置您的上下文以及您想要的任何方法的返回应该是什么
Setup(c=>c.GetDbCommand(It.IsAny(),It.IsAny()).Returns(command.Object);
//调用要测试的方法
InsertData(context.Object);
//断言上下文方法已被调用
验证(c=>c.Connect(),Times.Once);
验证(c=>c.DisConnect(),次.Once);
Verify(c=>c.GetDbCommand(It.IsAny(),It.IsAny()),Times.Once);
//断言命令方法已被调用
Verify(c=>c.ExecuteNonQuery(),Times.Once);
}
}
您需要阅读:您必须更改您的方法,以测试它使用实例而不引用数据库的方式。据我所知,您需要具有连接和断开连接等方法的上下文接口,以及具有ExecutionQuery和ExecuteQuery等方法的命令接口。。。重构该方法后,您可以测试该方法。也许你也应该使用依赖注入。你应该读一下:你必须改变你的方法,以测试它使用实例而不引用数据库的方式。据我所知,您需要具有连接和断开连接等方法的上下文接口,以及具有ExecutionQuery和ExecuteQuery等方法的命令接口。。。重构该方法后,您可以测试该方法。也许你也应该使用依赖注入。