Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Moq . का उपयोग करके एक MySQL डेटाबेस में सम्मिलित क्वेरी का मज़ाक उड़ाते हुए

वर्तमान में परीक्षण के तहत विधि इसे आसानी से अलगाव में इकाई परीक्षण योग्य बनाने के लिए कार्यान्वयन चिंताओं के साथ बहुत कसकर युग्मित है। उन कार्यान्वयन संबंधी चिंताओं को दूर करने का प्रयास करें ताकि अलग-अलग परीक्षणों के लिए उनका आसानी से मज़ाक उड़ाया जा सके।

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 का उपयोग करने के तरीके को बेहतर ढंग से समझने के लिए उनके Quickstart देखें।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस पर मीडिया फ़ाइलों को संग्रहीत करने का सबसे अच्छा तरीका क्या है?

  2. MySQL एक चर में EXECUTE के परिणाम सहेजता है?

  3. त्रुटि:स्थानीय डेटा लोड करना अक्षम है - यह क्लाइंट और सर्वर दोनों पक्षों पर सक्षम होना चाहिए

  4. डेटाबेस से समान देशांतर और अक्षांश प्राप्त करना

  5. MySQL में रैंडम तारीख डालें/अपडेट करें