2017-08-09 9 views
2

私はMoqを使ってコントローラをテストすることを学んでいますが、コントローラからのデータレイヤコールをどのようにバイパスするべきかはわかりません。私は以下のような方法があるとします。そのような単純なコントローラをテストするために私はどのようなアプローチをとるだろうか?Moqを使用してデータレイヤーをバイパスする方法は?

[HttpPost] 
public ActionResult SomeController(SomeModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     // Perform some manipulation on modeldata 
     model.Value++; 

     // Upload Model, Get ID 
     model.Id = MyDataLayer.UploadToDb(model); 
    } 
    return View(model); 
} 
+2

インターフェイスを使用してデータレイヤを抽象化する必要があります。コントローラのコンストラクタにデータレイヤの実装を挿入します。実装は、moq'dバージョンか実際の実装のどちらでもかまいません。 – KiwiPiet

+0

HotFuzz(@KiwiPietを指し示す)を引用するには: "彼が言ったこと"。 – code4life

+1

この例の 'MyDataLayer'静的変数またはローカル変数は提供されていますか? – Nkosi

答えて

2

このような何か:

interface IMyDataLayer 
{ 
    int UploadToDb(SomeModel model); 
} 
class MyDataLayer : IMyDataLayer 
{ 
    public int UploadToDb(SomeModel model) 
    { 
     // Implementation ... 
    } 
} 
class MyController : Controller 
{ 
    private readonly IMyDataLayer _datalayer; 
    public MyController(IMyDataLayer datalayer) 
    { 
     _datalayer = _datalayer; 
    } 

    [HttpPost] 
    public ActionResult SomeAction(SomeModel model) 
    { 
     if(ModelState.IsValid) 
     { 
      // Perform some manipulation on modeldata 
      model.Value++; 

      // Upload Model, Get ID 
      model.Id = _datalayer.UploadToDb(model); 
     } 
     return View(model); 
    } 
} 

次にあなたがIMyDataLayerのモックを作成するために部品番号を使用することができます。

+0

モックを作成してSUTに注入する例を表示 – Nkosi

+0

これはOPの役に立ちます。彼らはMOQを使ってそれをする方法を尋ねましたか?あなたがしたことは、依存関係注入を可能にするためにコードをリファクタリングする方法を示しています。 – Nkosi

1

次のようにmoqを使用してKiwiPetのソリューションを実装しました。

[TestMethod()] 
public void MyTestMethod() 
{ 
    // Create test input data 
    SomeModel TestModel = new SomeModel(); 
    TestModel.Value = 1; 

    // Create mocked data layer 
    var FakeDataLayer = new Mock<IMyDataLayer>(); 
    FakeDataLayer.Setup(x => x.UploadToDb(It.IsAny<SomeModel>()).Returns(TestValueIWantReturned); 

    // Create controller using fake data service 
    var controller = new MyController(FakeDataLayer.Object); 

    // Controller function call 
    var result = controller.SomeAction() as ViewResult; 

    // Assert stuff 
    Assert.IsNotNull(result); 
    Assert.IsNotNull(result.Model); 
    // ... 

}