Dot-Net
如何模擬 System.Data.Linq.Table<MyClass>
我的一個基礎儲存庫類包含一個方法:
public abstract class RepositoryBase<T, TDb> : IRepository<T> where T : IEntity where TDb : class, IDbEntity, new() { protected internal abstract Table<TDb> GetTable(); ... }我正在為包含上述方法的實現的派生儲存庫類編寫單元測試:
public class CmOptionRepository : RepositoryBase<ICmOption, CMCoreDAL.DbData.CMOption>, ICmOptionRepository { protected internal override System.Data.Linq.Table<CMCoreDAL.DbData.CMOption> GetTable() { return Context.CMOptions; } .... }這裡: Context - 是 DB 的 Linq 模型,CMOptions - DB 表之一。
我希望我的“GetTable()”方法返回一組特殊的數據。
我將模擬該方法:
System.Data.Linq.Table<CMCoreDAL.DbData.CMOption> table = ...; Mock<CmOptionRepository> mockRepository = new Mock<CmOptionRepository>(MockBehavior.Strict); mockRepository.Setup(mock => mock.GetTable()).Returns(table);但不知道如何創建
System.Data.Linq.Table<CMCoreDAL.DbData.CMOption>類的實例。問題:我怎樣才能模擬
System.Data.Linq.Table<>?或者我可能需要更改方法簽名以避免System.Data.Linq.Table<>類使用?請指教。歡迎任何想法。
PS我正在使用起訂量。
如果您使用的是 .NET 4.0,則
Table<T>實現ITable<T>以便您應該ITable<TDb>在返回類型中使用介面GetTable而不是具體類型。然後你就可以嘲笑了。在 .NET 3.5 中它有點困難,因為
Table<T>只有實現ITable(不是通用的)。
Table<T>除非明確需要對Table<T>實例執行操作,否則不應真正暴露在儲存庫之外。相反,返回IQueryable<T>您的儲存庫,這更容易模擬。如果您需要執行更新,那麼您可以返回ITable<T>.