2014-12-03 63 views
0

我寫的擴展方法幫手假數據加載到的DbContext可以派生使用與TypeMock使用泛型的動作WhenCalled

public static void RegisterFakeData<T>(this DbContext databaseContext, ObjectSet<T> action, IEnumerable<T> fakeData) where T : class 
{ 
    Isolate.WhenCalled(() => action).WillReturnCollectionValuesOf(fakeData.AsQueryable()); 
} 

這個工作過程所需的,但我不知道是否有可能得到dbcontext上的屬性被傳入(操作參數)從假數據的類型。

所以如果我設置客戶屬性,我只是通過一個客戶列表。

當前使用情況:

Isolate.Fake.StaticConstructor<DbContext>(); 
var databaseContext = Isolate.Fake.Instance<DbContext>(); 

databaseContext.RegisterFakeData(databaseContext.Customer, new List<Customer> { new Customer { CustID = "cust1", RegionCode = "region1"}}) 

所需的使用:

databaseContext.RegisterFakeData(new List<Customer> { new Customer { CustID = "cust1", RegionCode = "region1"}}) 

回答

1

我從Typemock酒吧。

,因爲我們沒有任何假反射的方法,你可以使用此解決方法:

public void RegisterFakeData<T> (Context ctx,IEnumerable<T> list) 
     { 
      var name =typeof (T).Name; 
      var mi = ctx.GetType().GetProperty(name).GetGetMethod(); 
      var args = new object[0] ; 
      Isolate.WhenCalled(() =>(IEnumerable<T>)mi.Invoke(ctx,args)).WillReturnCollectionValuesOf(list); 
     } 
+0

我發現的情況下這是行不通的。如果在帶有.ToList()的linq查詢中使用上下文,那麼它可以正常工作,但是如果linq查詢正在訪問查詢中的上下文屬性,那麼它將引發空異常。非常接近,但我不想不必要地使用.ToList()。即:var member =(來自_databaseContext.Customer中的customer,其中customer.CustID == blah select customer)拋出異常。更改爲_databaseContext.Customer.ToList(),它的工作原理,但這並不好。 – 2015-01-08 05:59:46

0

您可以使用AsQueryable已():

Isolate.WhenCalled(() => (IEnumerable<T>)mi.Invoke(ctx,args)).WillReturnCollectionValuesOf 
(list.AsQueryable());