2012-01-19 40 views
3

填充ObjectResult为了测试使用存储过程的方法,已创建一个伪方法。这个方法是返回一个int列表。如何从List <>

事情是这样的......

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?>' 

试过(amoungst其他东西)

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中?

回答

3

线

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

返回boolean因为.All回报取决于是否集合中的所有元素TrueFalse符合指定条件。

因此,ObjectResult类型的变量不能设置为类型为Bool的变量。

ObjectResultObjectResult<T>类型有隐藏的构造函数,这意味着你不能随意创建实例。此外,ObjectResult<T>类型是密封的,这意味着它不能被扩展。所以,如果您想从Enumerable创建ObjectResult的简单方法,那么您的运气可能不好。

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

void Foo(ObjectResult<int?> result); 

将其更改为:

void Foo(IEnumerable<int?> result); 

这将允许您创建一个假的收集与方法进行测试,你仍然会能够通过ObjectContext<int?>类型的方法,因为ObjectContext<int?>延伸了IEnumerable<int?>

+0

谢谢肯,很高兴我没有失去明显的东西。该方法位于实体框架上下文中,因此函数签名不能更改。可能会用鼹鼠来嘲笑它。 – PhilW

+0

从EF 6.1.3开始,ObjectResult 的构造函数被保护,并且类不再被密封。这允许继承,并且您可以创建MyObjectResult :ObjectResult ,其中可以传入List ,并且可以覆盖GetEnumerator,例如, _list.GetEnumerator,并且可以在返回基本ObjectResult 的任何位置使用派生类。 – panpawel

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>对象,如果不是实际ObjectResult<T>上嘲笑单个项目。

相关问题