Vì bạn đang sử dụng Linq to Sql, đây là một mẫu thử nghiệm kịch bản bạn đã đề cập bằng cách sử dụng NUnit và Moq. Tôi không biết chi tiết chính xác về DataContext của bạn và những gì bạn có sẵn trong đó. Chỉnh sửa cho nhu cầu của bạn.
Bạn sẽ cần phải bọc DataContext bằng một lớp tùy chỉnh, bạn không thể Mock DataContext bằng Moq. Bạn cũng không thể giả lập SqlException, vì nó đã được niêm phong. Bạn sẽ cần phải bọc nó bằng lớp Ngoại lệ của riêng mình. Không khó để thực hiện được hai điều này.
Hãy bắt đầu bằng cách tạo thử nghiệm của chúng tôi:
[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);
}
Hãy triển khai thử nghiệm, trước tiên hãy kết hợp các lệnh gọi Linq thành Sql của chúng ta bằng cách sử dụng mẫu kho lưu trữ:
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);
}
}
Tiếp theo, tạo IDataContextWrapper như vậy, bạn có thể xem bài đăng trên blog này về chủ đề, của tôi khác một chút:
public interface IDataContextWrapper : IDisposable
{
Table<T> Table<T>() where T : class;
}
Tiếp theo, tạo lớp CustomSqlException:
public class CustomSqlException : Exception
{
public CustomSqlException()
{
}
public CustomSqlException(string message, SqlException innerException) : base(message, innerException)
{
}
}
Đây là một triển khai mẫu của 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);
}
}
}