使用MVC3和EF4,如何充分测试依赖于数据库往返来创建IDENTITY值的功能?



我有一个场景,测试中的代码将一条记录插入到数据库中,然后尝试使用它的主键从数据库中检索它。

这发生在同一方法中的一系列记录上。

我正在模拟我的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会随着每次连续调用而增加。

我应该存根数据库的返回值,等等,我将自己决定每个对象的主键。

你的测试目标是什么?

相关内容

  • 没有找到相关文章

最新更新