2012-08-03 68 views
8

我正在研究這個WebAPI項目,我需要爲它創建單元測試。該項目的基礎是使用VS 2010創建的,然後添加了WebApi模塊。C#WebApi單元測試和模擬控制器

控制器的工作方式有點妨礙測試/模擬。我使用xUnit和Moq,但絕對沒有必要堅持這兩個。

該應用程序使用特定對象來處理數據庫訪問,所以我有 controllerObject和其構造器需要DataAccessObject

我有嘲諷控制器/數據訪問對問題。我試圖運行的第一個測試是GetAllFromDataBase,但我沒有真正知道如何去做。

編輯:

我做了什麼的Cuong樂告訴我,現在全是移動的,我真的apreciate它。但我陷入了另一個問題。要訪問API,有一個用戶名/密碼對,我的控制器使用Thread.CurrentPrincipal.Identity.Name;現在我需要設置這個值,以使其完全工作,我猜。

另外valueServiceMock.Setup(service => service.GetValues()) .Returns(new [] {「value1」,「value2」});

似乎沒有工作。因爲代碼試圖訪問數據庫,並且什麼也得不到,因爲它無法獲得有效的用戶名以尋找

+0

你不應該嘲笑控制器,你會嘲笑控制器需要的服務。如果你嘲笑控制器,你不會測試控制器。這是完整的一點。看看這個帖子:http://www.peterprovost.org//blog/2012/06/16/unit-testing-asp-dot-net-web-api/ – tugberk 2012-08-03 22:01:55

+0

你是否檢查過你通過模擬對象構造函數是這樣的:var controller = new ValuesController(valueServiceMock.Object); – 2012-08-07 06:35:50

回答

18

爲了讓您的應用程序可測試,您需要考慮設計可測試性。從技術上講,設計爲可測試性,你的應用應該儘可能地在層之間,組件之間甚至類之間進行鬆耦合。

很多關於可測試性設計的提示:避免密封,靜態類...但是最需要注意的是dependency injection pattern,而不是在構造器或其他對象的方法內部創建對象,這個對象應該被注射。通過這種方式,我們通過嘲笑框架使我們對產生寬鬆的依賴關係。特別針對依賴外部資源的對象:網絡,文件或數據庫。

如何使用依賴注入注入對象:這就是爲什麼IocContainer是正確的工具,它會自動爲您注入對象。我喜歡使用的IoC容器是:AutofacNInject。在這裏

實例注入ValueService到ValuesController:

public class ValuesController : ApiController 
{ 
    private readonly IValueService _valueService; 

    public ValuesController(IValueService valueService) 
    { 
     _valueService = valueService; 
    } 

    public string[] Get() 
    { 
     return _valueService.GetValues(); 
    } 

    public string Get(int id) 
    { 
     return _valueService.GetValue(id); 
    } 
} 

而且下面是簡單的代碼進行單元測試與起訂量:

var valueServiceMock = new Mock<IValueService>(); 
valueServiceMock.Setup(service => service.GetValues()) 
      .Returns(new[] { "value1", "value2" }); 

var controller = new ValuesController(valueServiceMock.Object); 
var values = controller.Get(); 

Assert.AreEqual(values.Length, 2); 
Assert.AreEqual(values[0], "value1"); 
Assert.AreEqual(values[1], "value2"); 
+0

我做了你告訴我的事,現在整體都在移動,我真的很喜歡它。但我陷入了另一個問題。要訪問API,有一個用戶名/密碼對,我的控制器使用Thread.CurrentPrincipal.Identity。名稱; – oSR 2012-08-06 18:45:12

+0

我希望能在這裏解決這個問題,但讓我們再提出一個問題! – oSR 2012-08-06 18:53:54