Asp.net mvc 3 使用MVC3和EF4,如何充分测试依赖数据库往返来创建标识值的功能?
我有一个场景,测试中的代码将一条记录插入数据库,然后尝试使用其主键从数据库中检索回来 这在同一方法中的一系列记录上发生 我正在模拟ObjectContext和ObjectSet,因此当前的结果是,每个“插入”到FakeObjectSet中的记录都被赋予一个主键0 在我只插入一条记录并断言该记录存在的情况下,这很好……但是当我插入多条记录并且我的工作流要求按主键检索特定记录时,我的查询返回多个结果,因为所有插入的主键都为0Asp.net mvc 3 使用MVC3和EF4,如何充分测试依赖数据库往返来创建标识值的功能?,asp.net-mvc-3,unit-testing,entity-framework-4,moq,Asp.net Mvc 3,Unit Testing,Entity Framework 4,Moq,我有一个场景,测试中的代码将一条记录插入数据库,然后尝试使用其主键从数据库中检索回来 这在同一方法中的一系列记录上发生 我正在模拟ObjectContext和ObjectSet,因此当前的结果是,每个“插入”到FakeObjectSet中的记录都被赋予一个主键0 在我只插入一条记录并断言该记录存在的情况下,这很好……但是当我插入多条记录并且我的工作流要求按主键检索特定记录时,我的查询返回多个结果,因为所有插入的主键都为0 有什么想法吗?您的模拟存储库可以从id生成器(简单计数器)检索id,该id
有什么想法吗?您的模拟存储库可以从id生成器(简单计数器)检索id,该id生成器随每次连续调用而递增。我应该存根数据库中的返回值,然后我将自己决定每个对象将具有哪些主键
测试的目标是什么?您可以将事件添加到调用
AddObject
时将引发的FakeObjectSet
。然后在测试中,添加一个事件处理程序来设置所添加对象的Id
例如,伪对象集的简化版本:
public class ObjectAddedEventArgs<T> : EventArgs
{
public T Item { get; set; }
}
public class FakeObjectSet<T>
{
private List<T> _list = new List<T>();
public event EventHandler<ObjectAddedEventArgs<T>> ObjectAdded;
public void AddObject(T item)
{
_list.Add(item);
OnObjectAdded(item);
}
protected virtual void OnObjectAdded(T item)
{
EventHandler<ObjectAddedEventArgs<T>> h = AddingItem;
if (h != null)
{
h(this, new ObjectAddedEventArgs<T> { Item = item });
}
}
// other methods...
}
你的基本意思是我应该为我的FakeObjectSet定义一个全局范围的计数器,并向AddObject()添加一个回调,该回调会增加计数器并将其新值分配给当前插入的实体吗?事实证明我们在模拟ObjectContext,但使用的是FakeObjectSet的一个具体实例。这意味着我们不能在FakeObjectSet的实例上模拟或向AddObject方法添加回调或其他任何东西…不确定您的模型是否允许回调,但无法使用GUID作为密钥。这样,它将始终是唯一的,并且在插入和检索时不会有任何问题。但是,我假设您在插入int时插入0,但我还是建议您这样做。这是迄今为止解决此问题最为深思熟虑的方法,我认为它将完全按照预期工作。我要回答,但也要提到,我们的替代解决方案是为新实体提供负整数值,以便它们在内存中/保存上下文之前是唯一的,但在保存到数据库时正确分配标识值。。。
int id = 0;
FakeObjectSet<Foo> set = new FakeObjectSet<Foo>();
set.ObjectAdded += (s, e) => { e.Item.Id = id++; };