2017-06-02 85 views
0

我將使用單元測試項目創建用戶註冊方法測試。請參考下面的代碼在Mock框架中返回NULL值在UnitTesting中

[TestClass] 
public class PersonRegistration 
    { 
    private ILoggingService _loggingService; 
    private IUserManager _userManager; 
    public PersonRegistration(IUserManager userManager, ILoggingService 
    loggingService) 
    { 
     this._userManager = userManager; 
     this._loggingService = loggingService; 
    } 

    [TestMethod] 
    public void TestMethod1() 
    { 
     RegisterBindingModel model = new RegisterBindingModel(); 
     AccountController ac = new AccountController(_userManager, _loggingService); 
     model.UserName = "[email protected]"; 
     var result = ac.Register(model); 
     Assert.AreEqual("User Registered Successfully", result); 
    } 

在上面的代碼,當我跑的測試案例文件,它說

無法獲取默認的構造函數類****。Test.Controllers.PersonRegistraion

爲了克服這個問題,我添加了一個沒有任何參數的默認構造函數。第一個問題解決了。但是然後_userManager_loggingService變爲NULL。見圖像1.

Image 1

它將引發一個空引用異常(圖像2)

Image 2

所以我用MOQ(Using Moq)填滿接口,如以下。

[TestClass] 
public class PersonRegistration 
    { 
    [TestMethod] 
    public void TestMethod1() 
    { 
     var mockService = new Mock<ILoggingService>(); 
     var mockManager = new Mock<IUserManager>(); 
     RegisterBindingModel model = new RegisterBindingModel(); 
     AccountController ac = new AccountController(mockManager.Object, mockService.Object); 
     model.UserName = "[email protected]"; 
     var result = ac.Register(model); 
     Assert.AreEqual("User Registered Successfully", result); 
    } 
} 

Image 3

現在的代碼遍歷高達Register(),但它返回的結果爲NULL。這是由於無效的模擬對象?我可以在WebApi項目中正確運行整個過程。但是單元測試項目中同樣的方案返回null。

接口IUserManager

public interface IUserManager : IDisposable 
{ 
Task<string> Register(RegisterBindingModel model); 
} 

回答

1

首先,你應該在一個單獨的單元測試類編寫測試用例。第一個錯誤是因爲VS無法運行屬於PersonRegistration類的單元測試方法而導致的,該類沒有公共構造函數。

你正處在嘲弄接口的正確軌道上。這個問題不是由於無效的模擬對象造成的。你應該做的是,嘲笑的功能如下:

mockManager.Setup(it => it.Register(It.IsAny<RegisterBindingModel>())) 
      .Returns(Task.FromResult(string.Empty)); 
+0

謝謝@ashin。我在一個單獨的測試類中。我可以在哪裏放置上面提供的代碼。 –

+0

在你的測試方法中的下列語句之後:var mockManager = new Mock (); – ashin

+0

沒有與 '返回的問題(新的結果());'找不到 –