Linq to Sql'yi kullandığınız için, NUnit ve Moq kullanarak bahsettiğiniz senaryoyu test etmenin bir örneğini burada bulabilirsiniz. DataContext'inizin tam ayrıntılarını ve içinde ne bulunduğunu bilmiyorum. İhtiyaçlarınıza göre düzenleyin.
DataContext'i özel bir sınıfla sarmalamanız gerekir, DataContext'i Moq ile alay edemezsiniz. Mühürlü olduğu için SqlException da alay edemezsiniz. Kendi Exception sınıfınızla sarmalamanız gerekecek. Bu iki şeyi başarmak zor değil.
Testimizi oluşturarak başlayalım:
[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);
}
Testi uygulayalım, önce Linq to Sql çağrılarımızı depo modelini kullanarak sarmalayalım:
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);
}
}
Daha sonra IDataContextWrapper'ı bu şekilde oluşturun, konuyla ilgili bu blog gönderisini görüntüleyebilirsiniz, benimki biraz farklıdır:
public interface IDataContextWrapper : IDisposable
{
Table<T> Table<T>() where T : class;
}
Ardından CustomSqlException sınıfını oluşturun:
public class CustomSqlException : Exception
{
public CustomSqlException()
{
}
public CustomSqlException(string message, SqlException innerException) : base(message, innerException)
{
}
}
İşte IDataContextWrapper'ın örnek bir uygulaması:
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);
}
}
}