2016-12-22 3 views
1

APIエンドポイントからデータを取得するWebプロジェクトを作成しています。 APIレイヤーは、サービスレイヤーとリポジトリーレイヤーの最下部に位置しています。私はServiceとAPI Layersの単体テストを書いています。私は依存関係を模擬するためにMoqフレームワークを使用しています。 これで、MVCコントローラをテストします。私は、APIエンドポイントからデータを取得するためにHttpClientから派生したRequest Managerクラスを使用しています。では、どうすればこのコントローラをテストできますか?単体テストを作成しましたが、テストでは自分のデータベースから直接データを取得しています。APIエンドポイントからデータを取得するMVCコントローラをテストする

public class UserController : Controller 
{ 
    private RequestManager requestManager = new RequestManager(); 
    // GET: User 
    public async Task<ActionResult> Index() 
    { 
     List<UserViewModel> allUsers = await requestManager.GetUsers(); 

     if(allUsers == null) 
     { 
      throw new HttpException(404, "No Users Found"); 
     } 

     return View(allUsers); 
    } 
} 

public class UserControllerTest 
{ 
    public UserController controller; 

    [OneTimeSetUp] 
    public void InIt() 
    { 
     controller = new UserController(); 
    } 
    [Test] 
    public async Task TestIndex() 
    { 
     var view = await controller.Index() as ActionResult; 
     Assert.That(view is ViewResult); 
     Assert.That(view.Model is List<UserViewModel>); 
    } 
} 
+1

抽象的な離れたタイトカップリングとマージ/置換が可能なように依存関係を公開するため、単体テスト時の柔軟性が向上します。あなたはコードのテスト容易性を向上させるためにリファクタを考慮する必要があります。いずれか、またはあなたのhttpclient派生マネージャクラスでカスタムメッセージハンドラを使用することについて考えてください – Nkosi

+1

私は私のコントローラにIRequestManagerインターフェイスを注入して模擬しなければならないようです。カスタムメッセージハンドラはどのように役立ちますか? –

答えて

0

あなたは、コントローラとマネージャーを切り離す必要があります。インターフェイスをRequestManagerから抽出し、コントローラに注入します。それは問題ではありません、IOCのコンテナはあなたのためにそれを行うことができます。

public class UserController : Controller 
{ 
    private RequestManager _requestManager; 

    public UserController(IRequestManager requestManager) 
    { 
     _requestManager = requestManager; 
    } 

    // GET: User 
    public async Task<ActionResult> Index() 
    { 
     List<UserViewModel> allUsers = await _requestManager.GetUsers(); 

     if(allUsers == null) 
     { 
      throw new HttpException(404, "No Users Found"); 
     } 

     return View(allUsers); 
    } 
} 

次に、ユニットテストでIRequestManagerをモックすることができます。

0

、このいずれかを試してみてください。..

public class UserController : Controller 
{ 
    private RequestManager requestManager = new RequestManager(); 
    Mock<RequestManager> mockRepository = new Mock<RequestManager>(); 
    Mock<UserViewModel> mockUserViewModel = new Mock<UserViewModel>(); 
    ViewResult viewResult; 

    // GET: User 
    public async Task<ActionResult> Index() 
    { 
     List<UserViewModel> allUsers = await requestManager.GetUsers(); 

     if(allUsers == null) 
     { 
      throw new HttpException(404, "No Users Found"); 
     } 

     return View(allUsers); 
    } 
} 

public class UserControllerTest 
{ 
    public UserController controller; 

    [OneTimeSetUp] 
    public void InIt() 
    { 
     controller = new UserController(); 
    } 
    [Test] 
    public async Task TestIndexWhenAllUsersNULL() 
    { 
     var view = await controller.Index() as ActionResult; 
     List<mockUserViewModel> listofusermodel = new List<mockUserViewModel>(); 
     //add some dummy data in your List so it will not getting data directly from your Database 
     mockRepository.Setup(x => requestManager.GetUsers()).Returns(listofusermodel); 
     Assert.That(view is ViewResult); 
     Assert.That(view.Model is List<mockUserViewModel>); 
    } 
} 
関連する問題