2017-04-16 50 views
1

我有一些麻煩來創建一個ModelViewFactory和存儲庫模擬的NUnit測試。NUnit使用ModelViewFactory和存儲庫創建一個測試Mock

我的測試應該測試我的控制器Get函數是否返回一個列表InternshipsViewModel s。

我的控制器:

public IHttpActionResult GetInternshipsForCoordinator() 
{ 
    return Ok(new InternshipsViewModelFactory().CreateInternshipsViewModel(_internshipRepository, _internshipRepository.GetAll())); 
} 

而且我的測試:

public void Get_ShouldReturnListOfInternshipsViewModel() 
{ 
    //Arrange 
    var allInternshipWithFeedbackViewModels = new List<InternshipsWithFeedbackViewModel> 
    { 
     new InternshipWithFeedbackViewModelBuilder().Build() 
    }; 

    Mock<InternshipsViewModelFactory> internshipViewModelFactoryMock = new Mock<InternshipsViewModelFactory>(); 
    internshipViewModelFactoryMock.Setup(
     c => 
      c.CreateInternshipsViewModel(It.IsAny<IInternshipRepository>(), 
       It.IsAny<IEnumerable<Internship>>())).Returns(() => allInternshipWithFeedbackViewModels); 

    //Act 
    var okResult = 
     _controller.GetInternshipsForCoordinator() as 
      OkNegotiatedContentResult<IEnumerable<InternshipsWithFeedbackViewModel>>; 

    //Assert 
    Assert.IsNotNull(okResult); 

} 

我知道,我應該用更多的斷言,而當這一個工程,我會使用較多。 我得到的錯誤是Error message

有人能幫我嗎?非常感謝幫助,因爲我不知道我做錯了什麼。

回答

1

首先被測試的方法是直接新建工廠。無法替代模擬測試的手段。

考慮抽象工廠背後和接口,以便在測試中替換它時提供更大的靈活性。

public interface IInternshipsViewModelFactory { 
    IEnumerable<InternshipsWithFeedbackViewModel> CreateInternshipsViewModel(IInternshipRepository internshipRepository, IEnumerable<Internship> internships); 
} 

確保實現繼承自上述接口/抽象。

通過將該依賴注入到控制器中來反轉控制器中的控制。

例如

public class MyController : ApiController { 
    IInternshipsViewModelFactory factory; 
    IInternshipRepository _internshipRepository; 

    public MyController(IInternshipsViewModelFactory factory, IInternshipRepository repository) { 
     this.factory = factory; 
     this._internshipRepository = repository; 
    } 

    public IHttpActionResult GetInternshipsForCoordinator() { 
     var models = factory.CreateInternshipsViewModel(_internshipRepository, _internshipRepository.GetAll()); 
     return Ok(models); 
    } 
} 

這將允許你嘲笑的工廠,測試它注入到控制器和模擬的測試所需的行爲。

public void Get_ShouldReturnListOfInternshipsViewModel() { 
    //Arrange 
    var allInternshipWithFeedbackViewModels = new List<InternshipsWithFeedbackViewModel> { 
     //...populate collection 
    }; 

    var internshipViewModelFactoryMock = new Mock<IInternshipsViewModelFactory>(); 
    internshipViewModelFactoryMock 
     .Setup(_ => _.CreateInternshipsViewModel(It.IsAny<IInternshipRepository>(), It.IsAny<IEnumerable<Internship>>())) 
     .Returns(() => allInternshipWithFeedbackViewModels); 

    var repositoryMock = new Mock<IInternshipRepository>(); 
    repositoryMock.Setup(_ => _.GetAll()).Returns(new List<Internship>()); 

    var _controller = new MyController(internshipViewModelFactoryMock.Object, repositoryMock.Object); 

    //Act 
    var okResult = 
     _controller.GetInternshipsForCoordinator() as 
      OkNegotiatedContentResult<IEnumerable<InternshipsWithFeedbackViewModel>>; 

    //Assert 
    Assert.IsNotNull(okResult); 

} 
1

看起來你不能模擬InternshipsViewModelFactory,因爲它是一個具體的非抽象類型。您應該創建(並使用)接口IInternshipsViewModelFactory

然後Mock將能夠創建自己的實現IInternshipsViewModelFactory,這將按照您在模擬的安裝方法中描述的方式進行。