Dado que está utilizando Linq to Sql, aquí hay una muestra de prueba del escenario que mencionó utilizando NUnit y Moq. No conozco los detalles exactos de su DataContext y lo que tiene disponible en él. Edite según sus necesidades.
Deberá envolver el DataContext con una clase personalizada, no puede simular el DataContext con Moq. Tampoco puede burlarse de SqlException, porque está sellado. Deberá envolverlo con su propia clase de excepción. No es difícil lograr estas dos cosas.
Comencemos creando nuestra prueba:
[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);
}
Implementemos la prueba, primero envolvemos nuestras llamadas de Linq a Sql usando el patrón de repositorio:
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);
}
}
A continuación, cree el IDataContextWrapper así, puede ver esta publicación de blog sobre el tema, la mía difiere un poco:
public interface IDataContextWrapper : IDisposable
{
Table<T> Table<T>() where T : class;
}
A continuación, cree la clase CustomSqlException:
public class CustomSqlException : Exception
{
public CustomSqlException()
{
}
public CustomSqlException(string message, SqlException innerException) : base(message, innerException)
{
}
}
Aquí hay una implementación de muestra de 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);
}
}
}