如何从List<>填充ObjectResult

时间:2012-01-19 18:27:27

标签: c# entity-framework testing

为了测试使用存储过程的方法,已经创建了一个假方法。此方法是返回一个int列表。

像这样......

    public virtual ObjectResult<Nullable<int>> available_IDs( ... )
    {
        List<int?> fakeAvailableIDList = new List<int?>();
        fakeAvailableIDList.Add(1);
        fakeAvailableIDList.Add(2);
        fakeAvailableIDList.Add(3);

        ObjectResult<Nullable<int>> result = fakeAvailableIDList.All(m => m > 0);
        return result;
    }

失败
Cannot implicitly convert type 'bool' to 'System.Data.Objects.ObjectResult<int?>'

尝试过(其他事情)

ObjectResult<Nullable<int>> result = fakeAvailableIDList.All(m => m > 0);

给出了

Cannot implicitly convert type 'System.Collections.Generic.List<int?>' to 'System.Data.Objects.ObjectResult<int?>'

如何获得列表&lt;&gt;进入ObjectResult?

2 个答案:

答案 0 :(得分:3)

该行

fakeAvailableIDList.All(m => m > 0);

返回一个布尔值,因为.All返回TrueFalse,具体取决于集合中的所有元素是否满足指定条件。

因此,ObjectResult类型的变量无法设置为Bool类型的变量。

ObjectResultObjectResult<T>类型具有隐藏的构造函数,这意味着您无法随意创建实例。此外,ObjectResult<T>类型是密封的,这意味着它不能被扩展。因此,如果您正在寻找一种从ObjectResult创建Enumerable的简便方法,那么您可能会失败。

我认为最简单的方法是更改​​您尝试测试的方法所使用的类型。因此,如果该方法具有签名:

void Foo(ObjectResult<int?> result);

将其更改为:

void Foo(IEnumerable<int?> result);

这将允许您创建一个可以测试该方法的假集合,并且您仍然可以将该方法传递ObjectContext<int?>类型,因为ObjectContext<int?>扩展{{1 }}

答案 1 :(得分:1)

我意识到这已经得到了回答,但我提出的一个解决方案就是模仿ObjectResult<T>的特定Linq扩展。

例如:

Mock.Get(PortalEntitiesMock).Setup(m => m.ExecuteSqlQuery(It.Is<String>(x => x.ToUpper().StartsWith("SELECT"))).FirstOrDefault()).Returns<string>(p=>p).Verifiable();

因此,如果不是实际的bjectResult<T>,您可以在O ObjectResult<T>对象上模拟单个项目。