Почему Query успешно выполняется, когда состояние соединения postgresql закрыто? - PullRequest
0 голосов
/ 11 апреля 2019

Я следовал Запрос на вставку в базу данных MySQL с использованием Moq в качестве руководства для выполнения moq. В моем случае я буду делать moq с postgesql.

Контрольный пример пройден. Однако у меня есть вопрос: почему «Запрос на обновление успешно выполнен» отображается, когда состояние соединения postgresql закрыто? Это ожидаемый результат, когда мы делаем moq? Если это не ожидаемый результат, что мне делать?

Заранее спасибо.

Вот результат консоли после выполнения этого теста.

УСТАНОВКА УСТРОЙСТВ ОБНОВЛЕНИЯ user_id = null WHERE camera_id = 'G41140'

Установлено соединение

Состояние До открытия: Закрыто

Состояние После открытия: Закрыто

Обновление успешно выполнено.

Это часть моего кода

   [Test, Order(1)]
  public void UpdateTest()
        {
            //Arrange

            DumpDatabase databaseSetting = new DumpDatabase();
            //Assume, fill the right setting for db
            databaseSetting.Host = "***.***.*.**";
            databaseSetting.Port = "****";
            databaseSetting.Database = "*****";
            databaseSetting.UserName = "******";
            databaseSetting.Password = "***********";

            var commandMock = new Mock<IDbCommand>();
            commandMock
                .Setup(m => m.ExecuteNonQuery())
                .Verifiable();

            var connectionMock = new Mock<IDbConnection>();
            connectionMock
                .Setup(m => m.CreateCommand())
                .Returns(commandMock.Object);

            var connectionFactoryMock = new Mock<IDbConnectionFactory>();
            connectionFactoryMock
                .Setup(m => m.CreateConnection())
                .Returns(connectionMock.Object);
            var sut = new DumpConnection(connectionFactoryMock.Object, databaseSetting);
            // Act
            sut.Update();
            // Assert
            commandMock.Verify();


        }
 public class DumpConnection : IDbConnectionFactory
    {
        DumpDatabase _databaseSetting;

        private IDbConnectionFactory connectionFactory;
        public DumpConnection(IDbConnectionFactory connectionFactory, DumpDatabase databaseSetting)
        {
            this.connectionFactory = connectionFactory;
            this._databaseSetting = databaseSetting;
        }

        public IDbConnection CreateConnection()
        {
            return new NpgsqlConnection("Server=" + _databaseSetting.Host + ";User Id=" + _databaseSetting.UserName + "; " +
  "Password=" + _databaseSetting.Password + ";Database=" + _databaseSetting.Database + ";");
        }

        public void Update()
        {
            string query = "UPDATE DEVICES SET user_id=null WHERE camera_id = 'G41140' ";
            Console.WriteLine(query);
            using (var connection = connectionFactory.CreateConnection())
            {

                //Creates and returns a MySqlCommand object associated with the MySqlConnection. 
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = query;
                    Console.WriteLine("Established connection");
                    Console.WriteLine("State Before open : " + connection.State);
                    connection.Open();
                    Console.WriteLine("State After open : " + connection.State);
                    Console.WriteLine("Update query succesfully executed.");
                }
            }
        }

    }
    public interface IDbConnectionFactory
    {
        IDbConnection CreateConnection();

    }

1 Ответ

0 голосов
/ 11 апреля 2019

Это выглядит правильно для меня.Имейте в виду, когда вы издеваетесь над объектом (ну, это интерфейс), вы получаете смоделированную версию этого объекта.Поэтому, когда вы имитируете ваше соединение var connectionMock = new Mock<IDbConnection>();, вы больше не имеете дело с подключением к базе данных postgres, теперь вы имеете дело с вашей ложной версией.Таким образом, Connection.State не является состоянием соединения вашей базы данных, потому что вы на самом деле не соединяетесь с вашей базой данных.Вы просто притворяетесь ради теста, и в этом конкретном тесте вы просто подтверждаете, что вызван ExecuteNonQuery (который был изначально, вы, кажется, изменили код с тех пор, так что он больше не является).

Connection.Open() ничего не делает, потому что вы вызываете его по поддельному соединению и не настроили его на что-либо.

...