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