如何从列表填充ObjectResult<>;
本文关键字:lt gt ObjectResult 填充 列表 | 更新日期: 2023-09-27 18:20:44
为了测试使用存储过程的方法,创建了一个伪方法。这个方法是返回一个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?>'
如何获取列表<>进入ObjectResult?
行
fakeAvailableIDList.All(m => m > 0);
返回布尔值,因为.All
根据集合中的所有元素是否满足指定条件返回True
或False
。
因此,ObjectResult
类型的变量不能设置为Bool
类型的变量。
ObjectResult
和ObjectResult<T>
类型具有隐藏的构造函数,这意味着您不能随意创建实例。此外,ObjectResult<T>
类型是密封的,这意味着它不能扩展。因此,如果您正在寻找一种从Enumerable
创建ObjectResult
的简单方法,那么您可能运气不佳。
我认为,最简单的方法是更改要测试的方法所使用的类型。因此,如果该方法具有签名:
void Foo(ObjectResult<int?> result);
更改为:
void Foo(IEnumerable<int?> result);
这将允许您创建一个可以测试该方法的伪集合,并且您仍然可以向该方法传递ObjectContext<int?>
类型,因为ObjectContext<int?>
扩展了IEnumerable<int?>
。
我意识到这已经得到了回答,但我提出的解决方案是模拟ObjectResult<T>
的特定Linq扩展。
例如:
Mock.Get(PortalEntitiesMock).Setup(m => m.ExecuteSqlQuery(It.Is<String>(x => x.ToUpper().StartsWith("SELECT"))).FirstOrDefault()).Returns<string>(p=>p).Verifiable();
因此,如果不是实际的ObjectResult<T>
,则可以模拟O bjectResult<T>
对象上的各个项。