c# - 插入命令的单元测试

标签 c# mysql sql database unit-testing

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

    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);
    }
}

关于c# - 插入命令的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37022306/

相关文章:

c# - NEST FunctionScore()在添加函数之前返回所有索引的项目,在添加它们之后引发异常

c# - 在 Entity Framework 中区分 MySQL 和 SQL Server

java - Android Studio LoginActivity with MySQL - 尝试对网络服务进行身份验证

mysql - Mysql如何使用子查询定义SELECT LIMIT偏移量?

c# - EntityFramework 事务 - 保存到多个表

c# - 如何从 C# 执行批处理文件?

mysql - 两个带左连接的计数相乘

mysql - 查询多个表?

c# - 如何使用 C# 下载 Google SpreadSheets?

mysql - 按年份区间对行进行分组