2012-01-19 42 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>上嘲笑單個項目。

相關問題