我開始使用NHibernate,ASP.NET MVC 2.0和StructureMap開始一個新項目,並使用NUnit和Moq進行測試。對於我的每個控制器,我都有一個單獨的公共構造函數,其中注入了一個ISession。應用程序本身工作得很好,但就單元測試而言,我基本上必須模擬一個ISession來測試控制器。用Moq嘲笑NHibernate ISession
當我試圖嘲弄與MOQ的ISession的我得到了以下錯誤消息:
唯一屬性的訪問支持在中間調用
看來,我的問題是期待的名單 用戶從框架的CreateQuery方法,但谷歌搜索後,我現在更清楚的問題。
我有兩個問題:
1)這是錯誤的方式來模擬一個ISession
2)的依賴注入是有辦法修改代碼,以便它可以成功返回我的名單
[Test]
public void DummyTest()
{
var mock = new Mock<ISession>();
var loc = new Mock<User>();
loc.SetupGet(x => x.ID).Returns(2);
loc.SetupGet(x => x.FirstName).Returns("John");
loc.SetupGet(x => x.LastName).Returns("Peterson");
var lst = new List<User> {loc.Object};
mock.Setup(framework => framework.CreateQuery("from User").List<User>()).Returns(lst);
var controller = new UsersController(mock.Object);
var result = controller.Index() as ViewResult;
Assert.IsNotNull(result.ViewData);
}
請注意,我敢肯定,我可以創建用戶的硬編碼的列表(而不是嘲諷單個用戶並將其添加到列表中),但想我會離開這個代碼,因爲我有它馬上。
此外,此特定控制器的Index操作本質上執行了上面模仿的CreateQuery調用,以返回數據庫中的所有用戶。這是一個人爲的例子 - 不要讀任何細節。
在此先感謝您的幫助
編輯:在回答下面的評論,我加入了錯誤的堆棧跟蹤。此外,User類中的所有屬性都是虛擬的。
的TestCase 'Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView' 失敗:System.NotSupportedException: 唯一屬性訪問都在一個 設置支持中間調用 。不支持的表達式 framework.CreateQuery(「from User」)。 在 Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall在 Moq.ExpressionVisitor.Visit(MethodCallExpression m)上 Moq.ExpressionVisitor.Visit(表達式 EXP)在 Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall(MethodCallExpression 米)(式 EXP)處 Moq.Mock.GetInterceptor(LambdaExpression 拉姆達,模擬模擬) Moq.Mock.AutoMockPropertiesVisitor.SetupMocks(式 表達)在 Moq.Mock。 <> c__DisplayClass12 功能)在 Moq.Mock.Setup [T1,TResult](模擬模擬, 表達
1 expression) at Moq.Mock
1.設置[TResult](Expression`1 表達) 控制器\ UserControllerTest。CS(29,0): 在 Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView()
您能否顯示錯誤的堆棧跟蹤?用戶屬性是抽象的還是虛擬的? – 2009-12-02 00:06:01