Linq to Sql을 사용하고 있으므로 NUnit 및 Moq를 사용하여 언급 한 시나리오를 테스트하는 샘플이 있습니다. 귀하의 DataContext에 대한 정확한 세부 사항과 귀하가 사용할 수있는 내용을 모르겠습니다. 필요에 맞게 편집하십시오.
사용자 정의 클래스로 DataContext를 래핑해야하며 Moq로 DataContext를 모의 할 수 없습니다. 봉인되어 있기 때문에 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);
}
}
}