Оскільки ви використовуєте Linq to Sql, ось зразок тестування сценарію, про який ви згадали, за допомогою NUnit та Moq. Я не знаю точних деталей вашого DataContext та того, що у вас є в ньому. Редагуйте відповідно до своїх потреб.
Вам потрібно буде обернути DataContext спеціальним класом, ви не можете знущатися над DataContext за допомогою Moq. Ви також не можете знущатися над SqlException, оскільки він герметичний. Вам потрібно буде обернути його своїм власним класом Exception. Зробити ці дві речі не складно.
Почнемо зі створення нашого тесту:
[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);
}
}
}