เนื่องจากคุณใช้ Linq to Sql นี่คือตัวอย่างการทดสอบสถานการณ์ที่คุณกล่าวถึงโดยใช้ NUnit และ Moq ฉันไม่ทราบรายละเอียดที่แน่นอนของ DataContext ของคุณและสิ่งที่คุณมีอยู่ในนั้น แก้ไขตามความต้องการของคุณ
คุณจะต้องห่อ DataContext ด้วยคลาสที่กำหนดเองคุณไม่สามารถจำลอง DataContext ด้วย Moq ได้ คุณไม่สามารถเยาะเย้ย 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);
}
}
}