如何在C#中单元测试数据库方法?

时间:2015-02-12 15:39:36

标签: c# database unit-testing

我到处搜索,但我发现的任何内容都不适用于我目前的情况。

我有一个帮助DB连接的类,我需要对它的一些方法进行单元测试:

public class DBHelper
{
        private SqlConnection conn;
        private SqlCommand textCommand;

        public DBHelper(IDbConnection connection)
        {
            conn = (SqlConnection)connection;
            textCommand = new SqlCommand();
            textCommand.Connection = conn;
        }

        public SqlConnection Conn
        {
            get
            {
                return conn;
            }
            set
            {
                if (conn != null)
                {
                    conn.Close();
                    conn.Dispose();
                }
                conn = (SqlConnection)value;
                textCommand = new SqlCommand();
                textCommand.Connection = conn;
                textCommand.CommandType = CommandType.Text;
            }
        }

        public object QueryScalar(string query)
        {
            textCommand.CommandText = query;

            string qtype = query.Substring(0, 6).ToLower();

            if (qtype == "select")
                return textCommand.ExecuteScalar();

            return textCommand.ExecuteNonQuery();
        }
}

我知道我不应该从测试中访问数据库。我尝试使用模拟对象,但我认为他们不能在这里提供帮助,因为我不能从课堂外改变textCommand。我尝试设置SQLite数据库并通过SQL访问它,但无济于事。

我的问题是:如何对QueryScalar方法进行单元测试?

感谢您的任何想法。

1 个答案:

答案 0 :(得分:0)

也许你可以在课堂上使用这样的东西......

private IScalarQuerier _scalarQueryer;

public DBHelper(IDbConnection connection, IScalarQuerier q)
{
    _scalarQuerier = q;
    conn = (SqlConnection)connection;
    textCommand = new SqlCommand();
    textCommand.Connection = conn;
}

...然后将QueryScalar方法放在一个单独的类中,您可以在其中执行/测试您想要的任何内容。只需让该类实现一个接口IScalarQuerier,就可以将其传递给DBHelper

可能不是你想要的,但这应该让你用你想要测试的方法做你需要的。

旁注:然后,当您将该类(或IScalarQuerier - 实现,确切地说)传递到DBHelper时,您应该简单地假设查询器已在外部测试过DBHelper的范围,因此可以信任它正常工作。