Dot-Net

如何模擬 System.Data.Linq.Table<MyClass>

  • September 8, 2016

我的一個基礎儲存庫類包含一個方法:

public abstract class RepositoryBase&lt;T, TDb&gt; : IRepository&lt;T&gt;
   where T : IEntity
   where TDb : class, IDbEntity, new()
{
   protected internal abstract Table&lt;TDb&gt; GetTable();
   ...
}

我正在為包含上述方法的實現的派生儲存庫類編寫單元測試:

public class CmOptionRepository : 
   RepositoryBase&lt;ICmOption, CMCoreDAL.DbData.CMOption&gt;, ICmOptionRepository
{
   protected internal override System.Data.Linq.Table&lt;CMCoreDAL.DbData.CMOption&gt;
       GetTable()
   {
       return Context.CMOptions;
   }

....
}

這裡: Context - 是 DB 的 Linq 模型,CMOptions - DB 表之一。

我希望我的“GetTable()”方法返回一組特殊的數據。

我將模擬該方法:

       System.Data.Linq.Table&lt;CMCoreDAL.DbData.CMOption&gt; table = ...;
       Mock&lt;CmOptionRepository&gt; mockRepository =
           new Mock&lt;CmOptionRepository&gt;(MockBehavior.Strict);
       mockRepository.Setup(mock =&gt; mock.GetTable()).Returns(table);

但不知道如何創建System.Data.Linq.Table&lt;CMCoreDAL.DbData.CMOption&gt;類的實例。

問題:我怎樣才能模擬System.Data.Linq.Table&lt;&gt;?或者我可能需要更改方法簽名以避免System.Data.Linq.Table&lt;&gt;類使用?

請指教。歡迎任何想法。

PS我正在使用起訂量。

如果您使用的是 .NET 4.0,則Table&lt;T&gt;實現ITable&lt;T&gt;以便您應該ITable&lt;TDb&gt;在返回類型中使用介面GetTable而不是具體類型。然後你就可以嘲笑了。

在 .NET 3.5 中它有點困難,因為Table&lt;T&gt;只有實現ITable(不是通用的)。

Table&lt;T&gt;除非明確需要對Table&lt;T&gt;實例執行操作,否則不應真正暴露在儲存庫之外。相反,返回IQueryable&lt;T&gt;您的儲存庫,這更容易模擬。如果您需要執行更新,那麼您可以返回ITable&lt;T&gt;.

引用自:https://stackoverflow.com/questions/4248882