C# 当调用TypeMock时,是否可以使用泛型派生操作
我已经编写了一个扩展方法助手,用于将伪数据加载到DbContext中C# 当调用TypeMock时,是否可以使用泛型派生操作,c#,generics,typemock-isolator,C#,Generics,Typemock Isolator,我已经编写了一个扩展方法助手,用于将伪数据加载到DbContext中 public static void RegisterFakeData<T>(this DbContext databaseContext, ObjectSet<T> action, IEnumerable<T> fakeData) where T : class { Isolate.WhenCalled(() => action).WillReturnCollection
public static void RegisterFakeData<T>(this DbContext databaseContext, ObjectSet<T> action, IEnumerable<T> fakeData) where T : class
{
Isolate.WhenCalled(() => action).WillReturnCollectionValuesOf(fakeData.AsQueryable());
}
public static void RegisterFakeData(此DbContext databaseContext、ObjectSet操作、IEnumerable fakeData),其中T:class
{
当调用(()=>操作)时,隔离.WillReturnCollectionValuesOf(fakeData.AsQueryable());
}
这可以按预期工作,但我想知道是否可以从伪数据的类型派生传入的dbcontext(action参数)的属性
因此,如果我正在设置Customer属性,我只需传入一个客户列表
当前使用情况:
Isolate.Fake.StaticConstructor<DbContext>();
var databaseContext = Isolate.Fake.Instance<DbContext>();
databaseContext.RegisterFakeData(databaseContext.Customer, new List<Customer> { new Customer { CustID = "cust1", RegionCode = "region1"}})
Isolate.false.StaticConstructor();
var databaseContext=Isolate.false.Instance();
databaseContext.registerMakedata(databaseContext.Customer,新列表{new Customer{CustID=“cust1”,RegionCode=“region1”})
预期用途:
databaseContext.RegisterFakeData(new List<Customer> { new Customer { CustID = "cust1", RegionCode = "region1"}})
databaseContext.registerMakedata(新列表{new Customer{CustID=“cust1”,RegionCode=“region1”})
我是Typemock的Bar
因为我们不伪造任何反射方法,所以您可以使用以下解决方法:
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);
}
public void RegisterFakeData(上下文ctx,IEnumerable列表)
{
变量名称=类型(T)。名称;
var mi=ctx.GetType().GetProperty(名称).getMethod();
var args=新对象[0];
孤立.WhenCalled(()=>(IEnumerable)mi.Invoke(ctx,args)).WillReturnCollectionValuesOf(列表);
}
您可以使用AsQueryable():
Isolate.WhenCalled(()=>(IEnumerable)mi.Invoke(ctx,args)).WillReturnCollectionValuesOf
(list.AsQueryable());
我发现这样做不起作用。如果在带有.ToList()的linq查询中使用上下文,那么它可以正常工作,但是如果linq查询正在访问查询中的上下文属性,那么它会抛出null异常。非常接近,但我不想不必要地使用.ToList()。ie:var member=(来自_databaseContext.customer中的customer,其中customer.CustID==blah select customer)引发异常。更改为_databaseContext.Customer.ToList(),它可以工作,但这并不好。
Isolate.WhenCalled(() => (IEnumerable<T>)mi.Invoke(ctx,args)).WillReturnCollectionValuesOf
(list.AsQueryable());