我試圖將Moq添加到MSTest中的測試中以測試我的代碼的某些部分。使用Moq來驗證對象內的列表是否正確更改
我想測試哪些代碼不工作的代碼是應該過濾服務所檢索的數據並將其傳遞的代碼片段。我的代碼通過MVP模式設置,我有以下組件。 (我測試我的演講)
服務 - >此服務被檢索對象的列表,並把這個模型中(我使用的是模擬(MOQ)返回值)
模型 - >具有一些常規屬性和文檔列表的實體對象
查看 - >我的用戶控件正在實現的接口與演示者交談。這個觀點也被moq嘲笑。
Presenter - > object從服務中檢索模型並將此模型分配給視圖的屬性。
在我正在工作的第一個場景中,我只是從服務中檢索模型,並且演示者將其傳遞給視圖的屬性。
//Setup AccountsPayableService Mock
_mockedDocumentService = new Mock<IDocumentService>();
DocumentModel<InvoiceDocumentRow> model = new DocumentModel<InvoiceDocumentRow>();
List<InvoiceDocumentRow> invoices = new List<InvoiceDocumentRow>();
InvoiceDocumentRow row = new InvoiceDocumentRow();
row.BillingMonth = DateTime.Now;
invoices.Add(row);
model.Documents = invoices;
_mockedDocumentService.Setup(service => service.GetInvoiceDocumentList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), _user)).Returns(model);
//Setup View Mock
_mockedView = new Mock<IInvoicesView>();
//Setup Presenter to be tested
_presenter = new FooPresenter(_mockedDocumentService.Object);
_presenter.SetView(_mockedView.Object);
//Act
//These events will make the presenter do the call to the service and assign this to the view property
_mockedView.Raise(view => view.Init += null, new EventArgs());
_mockedView.Raise(view => view.FirstLoad += null, new EventArgs());
//Assert
_mockedDocumentService.Verify(aps => aps.GetInvoiceDocumentList(from, changedTo, _user), Times.Once());
_mockedView.VerifySet(view => view.DocumentList = model);
此測試運行並正在運行完美。
但是我還有一個情況,演示者應該過濾從服務中獲得的一些結果並將一個子集分配給視圖。出於某種原因,我無法得到這個工作。
基本上,這是完全相同的測試代碼,除了使用演示者上的不同方法從服務中檢索數據,對其進行過濾並將其傳回給視圖。
當我這樣做對視圖屬性的斷言像以前那樣:
_mockedView.VerifySet(view => view.DocumentList.Documents = filteredModel.Documents);
我得到一個錯誤:
System.ArgumentException: Expression is not a property setter invocation.
我到底做錯了什麼?
首先,一個建議。考慮開始使用控制反轉。像Ninject這樣的框架可以執行此操作:http://code.google.com/p/ninject/。更多信息:http://davidhayden.com/blog/dave/archive/2008/06/25/NinjectInlineModuleFactoryMethodsProviderSamples.aspx – Custodio 2011-05-11 16:13:38
我們正在使用控制反轉。現在在我們的測試中沒有使用任何框架。 – GeertvdC 2011-05-12 07:37:13