2017-07-27 210 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的测试用例....那么如何写这个场景...... –