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

发布于 2024-12-09 16:49:33 字数 272 浏览 0 评论 0原文

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

这会以相同的方法发生在一系列记录上。

我正在嘲笑我的 ObjectContext 和 ObjectSets,所以当前的结果是“插入”到我的 FakeObjectSet 中的每条记录的主键都是 0。

在我只插入一条记录并断言该记录存在的情况下,这很好...但是当我插入多个并且我的工作流程需要通过主键检索特定记录时,我的查询会返回多个结果,因为所有插入的主键均为 0。

有什么想法吗?

I have a scenario where the code under test inserts a record into a database, then attempts to retrieve it back from the database using its primary key.

This happens over a series of records in the same method.

I am mocking my ObjectContext and ObjectSets, so the current result is that each record "inserted" into my FakeObjectSet is given a primary key of 0.

In the case where I am only inserting a single record and asserting the record exists, this is fine...but when I am inserting multiple and my workflow requires retrieving specific records by primary key, my queries return multiple results since all inserts have a primary key of 0.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夜声 2024-12-16 16:49:33

您可以向 FakeObjectSet 添加一个事件,该事件将在调用 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并更新对象的 Id

int id = 0;

FakeObjectSet<Foo> set = new FakeObjectSet<Foo>();
set.ObjectAdded += (s, e) => { e.Item.Id = id++; };

You can add an event to your FakeObjectSet<T> that will be raised when AddObject is called. Then in your test, add an event handler to set the Id of the object being added.

For example, a simplified version of a fake object set:

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...
}

And in your test, when you want to set an incrementing Id value, add a handler to your FakeObjectSet<T> and update the object's Id:

int id = 0;

FakeObjectSet<Foo> set = new FakeObjectSet<Foo>();
set.ObjectAdded += (s, e) => { e.Item.Id = id++; };
蓝戈者 2024-12-16 16:49:33

您的模拟存储库可以从 id 生成器(简单计数器)检索 id,该生成器随着每次连续调用而递增。

Your mock repository could retrieve the id from an id generator (simple counter), that increments with each consecutive call.

多孤肩上扛 2024-12-16 16:49:33

我应该存根数据库的返回值,依此类推,我将自己决定每个对象将具有哪些主键。

您的测试目标是什么?

I should stub the return values from the database and so on I will by myself decide what primary keys each object will have.

What is your goal for the tests?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文