Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# insert命令的单元测试_C#_Mysql_Sql_Database_Unit Testing - Fatal编程技术网

C# 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

我是单元测试新手,需要在代码中测试insert命令。谁能告诉我怎么做。。下面是我想测试的方法

    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等方法的命令接口。。。重构该方法后,您可以测试该方法。也许你也应该使用依赖注入。