我有一个场景,测试中的代码将一条记录插入到数据库中,然后尝试使用它的主键从数据库中检索它。
这发生在同一方法中的一系列记录上。
我正在模拟我的ObjectContext和ObjectSets,所以当前的结果是,"插入"到我的FakeObjectSet中的每个记录都被赋予了一个主键0。
在我只插入一条记录并断言该记录存在的情况下,这很好…但是当我插入多个并且我的工作流需要通过主键检索特定记录时,我的查询返回多个结果,因为所有插入的主键都为0。
任何想法?
您可以向FakeObjectSet<T>
添加一个事件,该事件将在AddObject
被调用时引发。然后在测试中,添加一个事件处理程序来设置所添加对象的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...
}
在您的测试中,当您想要设置一个递增的Id
值时,请向FakeObjectSet<T>
添加处理程序并更新对象的Id
:
int id = 0;
FakeObjectSet<Foo> set = new FakeObjectSet<Foo>();
set.ObjectAdded += (s, e) => { e.Item.Id = id++; };
模拟存储库可以从id生成器(简单计数器)检索id,该id会随着每次连续调用而增加。
我应该存根数据库的返回值,等等,我将自己决定每个对象的主键。
你的测试目标是什么?