2017-07-27 11 views
0

コントローラメソッドがTask.Runを有する場合NUnitのテストケースを記述する方法を知っておく必要があり()方法有するユニットテストコントローラ方法にTask.Run(())

たとえば以下のコードを見て

public class DataProcessController : Controller 
    {   

     public ActionResult Index(DataProcess model) 
     { 
      try 
      { 
       Task task = Task.Run(() => 
       { 
        try 
        { 
         Database.Insert(model); 
        } 
        catch(Exception ex) 
        { 
         Database.Log(ex); 
        } 
      }); 
      } 
      catch(Exception ex) 
      { 
       ModelState.AddModelError("Not able to process the data",string.Empty); 
       return this.View(model); 
      } 
      return RedirectToAction("Index"); 

     } 
    } 

************************************************* 

public class DataProcessControllerTest 
    { 
     [Test] 
     public void Index() 
     { 
      DataProcessController objController = new DataProcessController(); 
      DataProcess process = new DataProcess() { ProcessId = 501, ProcessName = "MorningBatch" }; 
      var result = objController.Index(process); 
      Assert.IsNotNull(result); 
     } 
    } 

*********************************** 

上記のテストメソッドを実行すると、タスク内のDatabase.Insert(モデル)行には当てられません。レコードが挿入されたかどうかをテストする必要があります。

テストケースの記述方法を助けてください。コントローラーメソッドのコードのすべての行に当てなければなりません。

助けてください。

答えて

0

まず、そのアクションをリファクタリングして非同期にする必要があります。 Databaseも、例のコードに基づいてstaticと表示されます。それはまた、テストするのを難しくします。その(Database)は抽象化され、明示的にコントローラに注入されるべきです。

public class DataProcessController : Controller { 
    private readonly IDatabase Database; 

    public DataProcessController(IDatabase Database) { 
     this.Database = Database; 
    } 

    public async Task<ActionResult> Index(DataProcess model) { 
     try { 
      await Task.Run(() => Database.Insert(model));     
     } catch(Exception ex) { 
      Database.Log(ex); 
      ModelState.AddModelError("Not able to process the data",string.Empty); 
      return this.View(model); 
     } 
     return RedirectToAction("Index"); 
    } 
} 

これは、ユニット・テストが含ま保守のためのより多くの柔軟性を可能とする、

public class DataProcessControllerTest { 
    [Test] 
    public async Task Index() { 
     //Arrange 
     var process = new DataProcess() { ProcessId = 501, ProcessName = "MorningBatch" }; 
     //mock database 
     var dbMock = new Mock<IDatabase>();    
     //inject mocked database into controller (SUT) 
     var objController = new DataProcessController(dbMock.Object); 

     //Act 
     var result = await objController.Index(process); 

     //Assert 
     Assert.IsNotNull(result); 
     //verify that the Insert method was called with the provided model 
     dbMock.Verify(_ => _.Insert(process), Times.Once()); 
    } 
} 
+0

事は、我々はNUnitのテストケースを記述する必要が与えられたコードで...コントローラを変更することはできませんです....だからこのシナリオのために書くことができます... –

関連する問題