चूँकि आप Linq का उपयोग Sql के लिए कर रहे हैं, यहाँ NUnit और Moq का उपयोग करके आपके द्वारा बताए गए परिदृश्य के परीक्षण का एक नमूना है। मुझे आपके DataContext और उसमें आपके पास क्या उपलब्ध है, इसकी सही जानकारी नहीं है। अपनी आवश्यकताओं के लिए संपादित करें।
आपको कस्टम वर्ग के साथ डेटा कॉन्टेक्स्ट को लपेटने की आवश्यकता होगी, आप मोको के साथ डेटा कॉन्टेक्स्ट को मॉक नहीं कर सकते। आप SqlException को नकली नहीं कर सकते, क्योंकि यह सील है। आपको इसे अपने स्वयं के अपवाद वर्ग के साथ लपेटने की आवश्यकता होगी। इन दोनों चीजों को पूरा करना मुश्किल नहीं है।
चलिए शुरू करते हैं अपना टेस्ट:
[Test]
public void FindBy_When_something_goes_wrong_Should_handle_the_CustomSqlException()
{
var mockDataContextWrapper = new Mock<IDataContextWrapper>();
mockDataContextWrapper.Setup(x => x.Table<User>()).Throws<CustomSqlException>();
IUserResository userRespoistory = new UserRepository(mockDataContextWrapper.Object);
User user = userRepository.FindBy(1);
}
आइए परीक्षण को लागू करते हैं, पहले चलो हमारे Linq को रिपॉजिटरी पैटर्न का उपयोग करके Sql कॉल में लपेटते हैं:
public interface IUserRepository
{
User FindBy(int id);
}
public class UserRepository : IUserRepository
{
public IDataContextWrapper DataContextWrapper { get; protected set; }
public UserRepository(IDataContextWrapper dataContextWrapper)
{
DataContextWrapper = dataContextWrapper;
}
public User FindBy(int id)
{
return DataContextWrapper.Table<User>().SingleOrDefault(u => u.UserID == id);
}
}
इसके बाद IDataContextWrapper बनाएं, आप इस ब्लॉग पोस्ट को इस विषय पर देख सकते हैं, मेरा एक छोटा सा अंतर है:
public interface IDataContextWrapper : IDisposable
{
Table<T> Table<T>() where T : class;
}
अगला CustomSqlException क्लास बनाएं:
public class CustomSqlException : Exception
{
public CustomSqlException()
{
}
public CustomSqlException(string message, SqlException innerException) : base(message, innerException)
{
}
}
यहाँ IDataContextWrapper का एक नमूना कार्यान्वयन है:
public class DataContextWrapper<T> : IDataContextWrapper where T : DataContext, new()
{
private readonly T _db;
public DataContextWrapper()
{
var t = typeof(T);
_db = (T)Activator.CreateInstance(t);
}
public DataContextWrapper(string connectionString)
{
var t = typeof(T);
_db = (T)Activator.CreateInstance(t, connectionString);
}
public Table<TableName> Table<TableName>() where TableName : class
{
try
{
return (Table<TableName>) _db.GetTable(typeof (TableName));
}
catch (SqlException exception)
{
throw new CustomSqlException("Ooops...", exception);
}
}
}