Poiché stai usando Linq to Sql, ecco un esempio di test dello scenario che hai menzionato usando NUnit e Moq. Non conosco i dettagli esatti del tuo DataContext e cosa hai a disposizione in esso. Modifica per le tue esigenze.
Avrai bisogno di racchiudere il DataContext con una classe personalizzata, non puoi simulare il DataContext con Moq. Non puoi nemmeno simulare SqlException, perché è sealed. Dovrai racchiuderlo con la tua classe di eccezione. Non è difficile realizzare queste due cose.
Cominciamo creando il nostro test:
[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);
}
Implementiamo il test, per prima cosa racchiudiamo le nostre chiamate da Linq a Sql usando il pattern del repository:
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);
}
}
Quindi crea l'IDataContextWrapper in questo modo, puoi visualizzare questo post del blog sull'argomento, il mio differisce un po ':
public interface IDataContextWrapper : IDisposable
{
Table<T> Table<T>() where T : class;
}
Quindi creare la classe CustomSqlException:
public class CustomSqlException : Exception
{
public CustomSqlException()
{
}
public CustomSqlException(string message, SqlException innerException) : base(message, innerException)
{
}
}
Ecco un'implementazione di esempio di 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);
}
}
}