2017-07-27 202 views
0

需要知道如何寫NUnit測試情況下,當控制器方法具有Task.Run()如何,其具有的單元測試控制器方法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(model)行。我們需要測試記錄是否被插入...

請幫助如何編寫測試用例,它應該在控制器方法中找到所有代碼行。

請幫忙。

回答

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的測試用例....那麼如何寫這個場景...... –