2012-02-02 77 views
1

我無法工作,如何犀牛模擬下面的語句的NhibernateSession查詢:如何嘲笑一個使用WHERE子句,並返回一個列表

var jobs = nhibernateSession.Query<Job>() 
.Where(x => x.Trust.Id == 1) 
.ToList(); 

我已經試過各種排列,但目前的不成功的嘗試是:

nhibernateSession.Expect(y => y.Query<Job>()) 
.IgnoreArguments() 
.Return(new List<Job> { new Job() }.AsQueryable()); 

的錯誤我得到的回覆是:

Source: Anonymously Hosted DynamicMethods Assembly 
Message: Object reference not set to an instance of an object. 
StackTrace: at lambda_method(Closure , Job) 
at System.Linq.Enumerable.WhereListIterator`1.MoveNext() 
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 

感謝您的任何意見。

Stu

+0

ahh,我看到你是一個布裏斯托爾stackoverflow'er老師:-) – Simon 2012-02-02 10:50:07

+0

heheh是啊...雖然現在在利茲工作 – 2012-02-02 11:06:21

+0

可能會更糟...我在紐波特:-) – Simon 2012-02-02 13:17:53

回答

3

是否因爲您的'信任'屬性在您從模擬中返回的新Job()對象上爲null?

這可以解釋的where子句中的NullReferenceException:

.Where(x => x.Trust.Id == 1) 

如果是這種問題的解決方法是:

nhibernateSession.Expect(y => y.Query<Job>()) 
    .IgnoreArguments() 
    .Return(new List<Job> { new Job{ Trust = new Trust() } }.AsQueryable()); 
+0

謝謝西蒙 - 工作過。 – 2012-02-02 11:00:56

+0

@glastored好東西。 – Simon 2012-02-02 11:51:38

2

作爲一個感興趣的問題 - 您是如何獲得圖層設置的?它看起來像你使用一個具體的NHibernateSession,這將使它很難嘲笑。我的建議是使用ISession,然後你就可以輕鬆地進行模擬。

我不熟悉的犀牛,但使用起訂量我會做:

Mock<ISession> MockSession = new Mock<ISession>(); 
MockSession.Setup(x => x.Query<It.IsAny<Job>()>()) 
      .Returns(new Lis<Job> { new Job()}.AsQueryable()); 

通常,接口是比具體的類更容易嘲笑。事實上,我唯一使用具體類的地方是靜態配置方法,我必須設置我的IoC容器。在其他地方,我使用接口。這樣,我的單元測試有點生產了! :)

希望這有些用處!

快樂編碼,
乾杯,
克里斯。

+0

我正在使用ISession,我只是將它寫在上面的代碼中,以顯示我正在使用的實體。謝謝。 – 2012-02-02 09:32:22

+0

在這種情況下,看到Simon的回答,我想他的回答可能就是你要找的! – Bertie 2012-02-02 10:54:47

3

查詢的方法是一個擴展方法,如果我沒記錯的話,不能AFAIK像moq那樣被嘲笑。