【发布时间】:2014-08-14 16:50:17
【问题描述】:
我正在为使用 System.Data.Linq DataConext 对象从数据库获取实体表的存储库编写单元测试。这是代码:
public class ForumRepository : IForumRepository
{
protected Table<Forum> DataTable;
IDataContextWrapper DataContext;
public ForumRepository(IDataContextWrapper DataContext)
{
DataTable = DataContext.GetTable<Forum>();
}
public Forum GetForumById(int id)
{
try
{
return DataTable.Single(f => f.tblForumID.Equals(id));
}
catch(Exception e)
{
return null;
}
}
这是包装器的实现:
public class DataContextWrapper<T> : IDataContextWrapper where T : EpixForumDataContext, 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> GetTable<TableName>() where TableName : class
{
return (Table<TableName>)db.GetTable(typeof(TableName));
}
我想测试存储库方法。
public class UnitTest1
{
[TestMethod]
public void Can_Get_Forum_ById()
{
//arrange
Forum dummyForum = new Forum() { tblForumID = 1};
Mock<ITable<Forum>> tableMock = new Mock<ITable<Forum>>();
tableMock.Object.Attach(dummyForum);
Mock<IDataContextWrapper> mock = new Mock<IDataContextWrapper>();
mock.Setup(m => m.GetTable<Forum>()).Returns(tableMock.Object) ;
//act
ForumRepository repos = new ForumRepository(mock.Object);
Forum resultForum = repos.GetForumById(1);
//assert
Assert.AreEqual(resultForum.tblForumID, 1);
Forum 是一个自动生成的类。我想为 Table 设置论坛,这样当我在 ContextWrapper 上执行 GetTable 时,我会得到论坛表。我不知道 Table.Attach 是否会将论坛附加到表格。另外,当我运行测试时,它会说
'要模拟的类型必须是接口或抽象类或非密封 类”。
难道我都搞错了吗?
【问题讨论】:
-
这条线正确吗?
Mock<ITable<TableName>> tableMock = new Mock<ITable<TableName>>();...我在您的代码中没有看到TableName类型 -
@pollirrata:很抱歉。它应该是 Mock
。立即编辑问题
标签: c# linq unit-testing moq