2011-05-11 32 views
1

我試圖將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. 

我到底做錯了什麼?

+0

首先,一個建議。考慮開始使用控制反轉。像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

+0

我們正在使用控制反轉。現在在我們的測試中沒有使用任何框架。 – GeertvdC 2011-05-12 07:37:13

回答

0

我找到了解決我自己的問題。

我將verifySet替換爲正常的斷言_mockedviw.object,所以我使用存根來測試,而不是模擬,這是完美的工作。使用我使用的存根功能:

_mockedView.SetupAllProperties(); 

默認情況下不可能比較2個不同的引用對象,所以我只是手動檢查屬性。

0

這不起作用,因爲filteredModel.Documentos在另一個上下文中。您的視圖不會收到此消息,會收到另一個來自某種過濾方法的列表。

改變一點你的結構我會建議創建擴展方法,並顯然測試給他們。 所以,你可以簡單的把list.FilterByName("Billy");

所以您將創建類似:

public static IEnumerable<ObjectFromVdCruijsen> FilteredByNome(this IEnumerable<ObjectFromVdCruijsen> enumerable, string name){ 
    if (!string.IsNullOrEmpty(name)){ 
      enumerable = enumerable.Where(s => s.Name.ToUpperInvariant().Contains(name.ToUpperInvariant())); 
    } 
    return enumerable; 
} 
+0

我知道有2個不同的模型實例。不過,我希望能夠檢查兩者在我的測試中是否相同。 – GeertvdC 2011-05-12 07:39:54

相關問題