Mysql
 sql >> база данни >  >> RDS >> Mysql

Подигравателна заявка за вмъкване към MySQL база данни с помощта на Moq

Понастоящем тестваният метод е твърде тясно свързан с проблемите на внедряването, за да може лесно да се тества единично в изолация. Опитайте да абстрахирате тези проблеми с внедряването, така че да могат лесно да бъдат подигравани за изолирани тестове.

public interface IDbConnectionFactory {
    IDbConnection CreateConnection();
}

Горната абстракция на фабриката за свързване може да се използва за достъп до другите необходими System.Data абстракции на вашето хранилище за MySql данни.

public class MyDataAccessClass {
    private IDbConnectionFactory connectionFactory;

    public MyDataAccessClass(IDbConnectionFactory connectionFactory) {
        this.connectionFactory = connectionFactory;
    }

    public void Insert(string firstname, string lastname) {
        var query = $"INSERT INTO `sakila`.`actor`(`first_name`,`last_name`) VALUES('" + firstname + "','" + lastname + "')";
        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");
                connection.Open();
                command.ExecuteNonQuery();
                Console.WriteLine("Insert query succesfully executed.");
                connection.Close();//is not actually necessary as the using statement will make sure to close the connection.
            }
        }
    }
}

Производствената реализация на фабриката ще върне действително MySqlConnection

public class MySqlConnectionFactory: IDbConnectionFactory {
    public IDbConnection CreateConnection() {
        return new MySqlConnection("connection string");
    }
}

които могат да бъдат предадени в слоя данни чрез инжектиране на зависимост

За тестване се присмивате на интерфейсите, като използвате избраната от вас рамка за подигравки или създавате свои собствени фалшификати, за да инжектирате и тествате метода си.

[TestClass]
public class DataAccessLayerUnitTest {
    [TestMethod]
    public void TestInsert() {
        //Arrange
        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 MyDataAccessClass(connectionFactoryMock.Object);
        var firstName = "John";
        var lastName = "Doe";

        //Act
        sut.Insert(firstName, lastName);

        //Assert
        commandMock.Verify();
    }
}

И накрая, препоръчително е да използвате командни параметри в командния текст, тъй като ръчното изграждане на низа на заявката отваря кода за атаки с инжектиране на SQL.

За да разберете по-добре как да използвате Moq, проверете техния Бърз старт




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL програма mysql_tzinfo_to_sql

  2. как да създадете php mysql приложение, което работи офлайн

  3. `date` е валидно име на колона на mysql?

  4. Замяна на PEAR:MDB2 на PHP 5.3

  5. Извличане на 2 последни публикации за всяка категория