Метод объединения C # с запросом MySql - PullRequest
0 голосов
/ 08 октября 2010

Я предпринял попытку модульного тестирования методов на уровне базы данных моего приложения.В моем тесте я планировал написать макеты, чтобы избежать прямого подключения к MySQL.Я напишу упрощенную версию своего кода для иллюстрации.Давайте начнем с модульного теста:

[TestMethod()]
public void TestMethod1()
{

DataBaseInterface database = new DataBaseInterface(); // this is the class which has the method I want to unit test

DataSet ds = new DataSet();

ds.Tables.Add(new DataTable("signals"));

ds.Tables[0].Columns.Add(new DataColumn("ID"));
ds.Tables[0].Columns.Add(new DataColumn("Content"));

DataRow row = ds.Tables[0].NewRow();

row["ID"] = "1";
row["Content"] = "Foo";

ds.Tables[0].Rows.Add(row);

MockDataBaseConnection db = new MockDataBaseConnection();


string result = database.GetContent(1);  // this is the method I want to unit test

}

Метод, который я хочу выполнить модульным тестом, выглядит примерно так:

public class DatabaseInterface
{

private MySqlConnectionAdapter _sqlConn;

public string GetContent(int i)
{

MySqlCommand command = _sqlConn.CreateCommand();

command.CommandText = String.Format("");

_sqlConn.Open();

MySqlDataReader reader = command.ExecuteReader();

/// more code here


}

Чтобы предотвратить использование реального соединения с базой данных в моем модуле, я написалНесколько макетов и здесь кроется проблема.Макеты выглядят так:

 public class MySqlConnectionAdapter
    {
        public MySqlConnection _sqlConn; 

        public MySqlConnectionAdapter()
        {
        }

        public MySqlConnectionAdapter(string con)
        {
            _sqlConn = new MySqlConnection(con);
        }

        public event MySqlInfoMessageEventHandler InfoMessage
        {
            add
            {
                _sqlConn.InfoMessage += value;
            }
            remove
            {
                _sqlConn.InfoMessage -= value;
            }
        }

        public virtual event StateChangeEventHandler StateChange
        {
            add
            {
                _sqlConn.StateChange += value;
            }
            remove
            {
                _sqlConn.StateChange -= value;
            }
        }

        public virtual void Open()
        {
            _sqlConn.Open();
        }

        public void Close()
        {
            _sqlConn.Close();
        }

        public string ServerVersion
        {
            get
            {
                return _sqlConn.ServerVersion;
            }
        }

        protected DbTransaction BeginDbTransaction(IsolationLevel isolationLevel)
        {
            return _sqlConn.BeginTransaction(isolationLevel);
        }

        public void ChangeDatabase(string databaseName)
        {
            _sqlConn.ChangeDatabase(databaseName);
        }


        public string ConnectionString
        {
            get
            {
                return _sqlConn.ConnectionString;
            }
            set
            {
                _sqlConn.ConnectionString = value;
            }
        }

        public virtual MySqlCommand CreateCommand()
        {
            return _sqlConn.CreateCommand();
        }

        public string DataSource
        {
            get
            {
                return _sqlConn.DataSource;
            }
        }

        public string Database
        {
            get 
            {
                return _sqlConn.Database;
            }
        }

        public ConnectionState State
        {
            get 
            {
                return _sqlConn.State;
            }
        }
    }

 public class MockDataBaseConnection : MySqlConnectionAdapter
    {
        public DataSet ds;

        public new MockMySqlCommand CreateCommand()
        {
            return new MockMySqlCommand(ds);
        }
    }

    public class MockMySqlCommand
    {
        private DataSet _ds;

        public MockMySqlReader ExcecuteReader()
        {
            return new MockMySqlReader(_ds);
        }

        public MockMySqlCommand(DataSet ds)
        {
            _ds = ds;
        }
    }

    public class MockMySqlReader
    {
        public DataSet _ds;

        private int currRow = 0;

        public MockMySqlReader(DataSet ds)
        {
            _ds = ds;
        }

        public bool Read()
        {
            if (currRow < _ds.Tables[0].Rows.Count)
            {
                currRow++;
                return true;
            }
            else return false;
        }

        public object GetValue(int i)
        {
            return _ds.Tables[0].Rows[currRow][i];
        }
    }

Когда исполняется строка _sqlConn.CreateCommand (), она выбрасывает и исключает.Это почему?Поля _sqlConn в моем методе модульного тестирования - это объект MockDataBaseConnection, и я хочу, чтобы он возвращал объект MockMySqlCommand.

Запечатанная классификация библиотеки MySQL вызывает головную боль.Может кто-нибудь объяснить, как я могу исправить свой код, или показать простой пример того, как выполнить модульное тестирование метода, который запрашивает базу данных, фактически не запрашивая базу данных.

1 Ответ

0 голосов
/ 29 июля 2015

Как и предположил Вулканино, я думаю, что было бы намного проще настроить экземпляр локальной базы данных и запустить тесты непосредственно на нем.

Я был в такой же ситуации и разрабатывал этот проектон просто устанавливает локальный работающий экземпляр тестового сервера MySql, не заботясь об администрировании сервера: https://github.com/stumpdk/MySql.Server

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...