2016-10-06 111 views
0

我最近搬到了我公司的一個新項目。我的任務是爲我們的一個控制器編寫REST API的單元測試。控制器實現了接口System.Web.Http.ApiController。我正在使用Moq,這是我第一次使用這個很酷的小庫。我的問題是,當我撥打電話ApiController.Ok()在單元測試中返回null

IHttpActionResult result = Ok(); 

在控制器中,對Ok()的調用返回null。這隻發生在我從單元測試中調用這個方法的時候。如果我直接使用Swagger調用我的方法,它會按預期工作。

我想,可能是起訂量語句我使用設置控制器的參數/控制器本身與控制器的實例在某種程度上搞亂,使訪問不繼承的接口方法?下面是我使用的設置單元測試代碼:

//Mock ICrmService to return an Id for a created company 
var crmCacheService = new Mock<ICrmCacheService>(); 
var crmService = new Mock<ICrmService>(); 

crmCacheService.Setup(x => x.CreateSubscription(It.IsAny<CreateSubscriptionModel>())).Returns(true); 
crmService.Setup(x => x.CreateSubscription(It.IsAny<CreateSubscriptionModel>())).Returns(ReturnedSubscriptionId); 

var controller = new Mock<SubscriptionController>(crmService.Object, crmCacheService.Object); 
IHttpActionResult actionResult = controller.Object.CreateSubscriptions(Guid.NewGuid().ToString(), 1); 

沒有人有任何想法,爲什麼這會使得調用好()返回NULL?我怎樣才能設置它,以便調用Ok()將返回System.Web.Http.Results.OkResult的正常結果?

回答

1

想必你的控制器測試下你的主題在這種情況下,在這種情況下,你真的不想嘲笑它在所有,但使用一個真正的實例,而不是(用嘲笑的依賴):

var controller = new SubscriptionController(crmService.Object, crmCacheService.Object); 

因爲你現在正在嘲笑它,並且由於OkControl()方法在ApiController中是虛擬的,所以Moq將能夠覆蓋它並且將這樣做。由於默認模擬行爲是覆蓋所有返回默認值(MockBehavior.Loose),您將獲得一個空返回值。

如果你真的想嘲笑它和報酬確定(),值再次,我不認爲你這樣做,你可以使用安裝程序有它穿過的真正方法(在許多其他事情,如指定的返回值你想):

controller.Setup(x => x.Ok()).CallBase(); 
+0

就是這樣。很有幫助。謝謝! – KSF

1

模擬類有一個名爲CallBase控制默認行爲覆蓋所有虛擬方法或沒有財產。輕鬆,你可以說:

controller.CallBase = true;

更多細節在這個答案:https://stackoverflow.com/a/43319142/5675763

相關問題