2017-04-16 12 views
1

ModelViewFactoryとリポジトリモックでNUnitテストを作成する際にいくつか問題があります。NUnit ModelViewFactoryとリポジトリモックでテストを作成

私のコントローラGet-functionがInternshipsViewModelのリストを返すかどうかテストする必要があります。

マイコントローラ:

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); 

} 

私はもっとアサート使う必要があることを知っており、この1つは働くとき、私はより多くを使用します。 私が得るエラーは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を代わりに作成(および使用)する必要があります。

次に、モックはIInternshipsViewModelFactoryという独自の実装を作成することができます。IInternshipsViewModelFactoryはモックのセットアップメソッドで説明したように動作します。

関連する問題