Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 使用MVC3和EF4,如何充分测试依赖数据库往返来创建标识值的功能?_Asp.net Mvc 3_Unit Testing_Entity Framework 4_Moq - Fatal编程技术网

Asp.net mvc 3 使用MVC3和EF4,如何充分测试依赖数据库往返来创建标识值的功能?

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

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

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

我正在模拟ObjectContext和ObjectSet,因此当前的结果是,每个“插入”到FakeObjectSet中的记录都被赋予一个主键0

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


有什么想法吗?

您的模拟存储库可以从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++; };