2010-10-19 32 views
0

我已經使用Moq 3.0設置了一個測試。我需要測試一個方法,它會改變數據庫中的某些值。我正在使用ASP.NET MVC,所以我想測試我的控制器。如何Moq有參數的方法,必須用列表做些什麼

我安裝這個

// Generate an implementer of IProductsRepository at runtime using Moq 
var mockTareasRepos = new Mock<IRepository>(); 
mockTareasRepos.Setup(x => x.ExecutedTask).Returns(tasks.AsQueryable()); 
return mockTareasRepos.Object; 

我需要補充的是得到一個任務id的新方法,並更改任務列表的字段的值。假設我需要更改的值是StartTime,它是一個日期時間,我需要將該值設置爲null,並且需要將該重複值設置爲1。

這是任務類

public class { 
    int taskId {get;set;} 
    DateTime StartTime {get;set;} 
    int retrys {get;set;} 
} 

我怎麼做到的?

mockTareasRepos.Setup(x => x.SetToExecuteTask(It.IsAny<int>())) 

我希望你明白我需要什麼,我的英語不太好。

回答

1

如果我正確地理解它,你想在調用Controller的方法之後測試一下,你的數據庫值應該被更新。你嘲笑你的倉庫,因爲你不想設置測試數據庫,對吧?所以,你的測試應該是這樣的:

mockTareasRepos.Setup(...) //Do the setup you need. 
var controller = new YourController(mockTareasRepos); 
controller.YourMethod(); 
mockTareasRepos.Verify(x => x.YourRepositoryUpdateMethod(It.IsAny<Task>, Times.Once())); 

最後一行將驗證您的控制器稱爲「YourRepositoryUpdateMethod」方法一次。通過這樣做,您可以測試您的控制器方法調用Repository接口來更新數據庫。

我希望它有幫助。如果這不是你想要的,請給我們更多的信息。

+0

它可以幫助,但我仍然需要執行方法的一些王,所以我可以有例如對象中刪除形成列表 - 一樣,如果它的remove形成數據庫 - 因爲我的控制器應該給我列表的Coutn值。 – 2010-10-19 17:14:43

+1

CONTROLLER的責任是什麼?測試一下,而不是你的倉庫,這就是爲什麼你嘲笑它。您不需要測試您的存儲庫是否從列表中刪除某些內容,因爲這是存儲庫的可重置性,而不是控制器(它是受測試的系統)。 – goenning 2010-10-19 19:44:49

1

我相信你正在尋找的Callback方法:

mockTareasRepos.Setup(x => x.RepositoryMethod(...)) 
    .Callback<IEnumerable<Task>>(tasks => /* modify tasks here */); 
    .Returns(tasks.AsQueryable()); 
相關問題