Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Mocowanie wstawiaj zapytanie do bazy danych MySQL za pomocą Moq

Obecnie testowana metoda jest zbyt ściśle powiązana z problemami implementacyjnymi, aby można ją było łatwo testować jednostkowo w izolacji. Spróbuj wyodrębnić te problemy dotyczące implementacji, aby można je było łatwo wyszydzić w przypadku izolowanych testów.

public interface IDbConnectionFactory {
    IDbConnection CreateConnection();
}

Powyższa abstrakcja fabryki połączeń może być użyta do uzyskania dostępu do innych niezbędnych System.Data abstrakcje Twojego magazynu danych 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.
            }
        }
    }
}

Implementacja produkcyjna fabryki zwróci rzeczywisty MySqlConnection

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

które można przekazać do warstwy danych za pomocą wstrzykiwania zależności

Do testowania wyśmiewasz interfejsy za pomocą wybranego przez siebie frameworka do szyderstwa lub tworzysz własne podróbki, aby wstrzyknąć i przetestować swoją metodę.

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

Wreszcie wskazane jest, aby użyć parametrów polecenia w tekście polecenia, ponieważ ręczne konstruowanie ciągu zapytania otwiera kod na ataki typu SQL injection.

Aby lepiej zrozumieć, jak korzystać z Moq, sprawdź ich Szybki start




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można utworzyć serwera połączonego - serwer sql i mysql

  2. Indeks rozwiązywania dla użytkownika tabeli jest uszkodzony; spróbuj to naprawić

  3. Dlaczego mój skrypt kopii zapasowej bazy danych nie działa w php?

  4. Solenie moich hashów za pomocą PHP i MySQL

  5. CRUD dla MySQL i PHP