Ponieważ używasz Linq do Sql, oto próbka testowania wspomnianego scenariusza przy użyciu NUnit i Moq. Nie znam dokładnych szczegółów Twojego DataContext i tego, co w nim masz. Edytuj według swoich potrzeb.
Będziesz musiał opakować DataContext klasą niestandardową, nie możesz Mockować DataContext za pomocą Moq. Nie można również mock SqlException, ponieważ jest on zapieczętowany. Będziesz musiał opakować go własną klasą wyjątków. Osiągnięcie tych dwóch rzeczy nie jest trudne.
Zacznijmy od stworzenia naszego testu:
[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);
}
Zaimplementujmy test, najpierw zawińmy nasze wywołania Linq do Sql przy użyciu wzorca repozytorium:
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);
}
}
Następnie utwórz IDataContextWrapper w ten sposób, możesz wyświetlić ten post na blogu na ten temat, mój trochę się różni:
public interface IDataContextWrapper : IDisposable
{
Table<T> Table<T>() where T : class;
}
Następnie utwórz klasę CustomSqlException:
public class CustomSqlException : Exception
{
public CustomSqlException()
{
}
public CustomSqlException(string message, SqlException innerException) : base(message, innerException)
{
}
}
Oto przykładowa implementacja 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);
}
}
}