已经设置了方法的MOQ,但是它在传递NULL参数时不会抛出异常

问题描述:

我有一个测试类并用测试方法初始化它。我还用模拟数据设置了方法返回。但是,当我传递无效参数,如null时,我应该返回一个null异常,就像我的类中实现的那样。已经设置了方法的MOQ,但是它在传递NULL参数时不会抛出异常

相反,我得到0个结果,而不是空例外。

[TestInitialize] 
     public void Initialize() 
     { 
      _mySSystemHealthRepo= new Mock<ImySSystemHealthRepo>(); 
      //Arrannge 



      List<JobHistory> allJobHistory = new List<JobHistory> 
      { 
       new JobHistory 
       { 
        Id = 2, 
        StartTime = DateTime.Parse("15 OCT 2017"), 
        EndTime = DateTime.Parse("18 OCT 2017"), 
        Engineer = [email protected]" 
        Name="Job1" 
       } 
       , 

       new JobHistory 
       { 
        Id = 3, 
        StartTime = DateTime.Parse("12 OCT 2017"), 
        EndTime = DateTime.Parse("14 OCT 2017"), 
        Engineer = "[email protected]" 
        Name="Job1" 
       }, 

       new JobHistory 
       { 
        Id = 4, 
        StartTime = DateTime.Parse("11 OCT 2017"), 
        EndTime = DateTime.Parse("16 OCT 2017"), 
         Engineer = "[email protected]" 
        Name="Job1" 
       } 

      }; 

      _ziSystemHealthRepo.Setup(obj => obj.GetJobHistoryByName(DateTime.Parse("01 OCT 2017"), DateTime.Parse("30 OCT 2017"), "TestJob")).Returns(allJobHistory); 
     } 


[TestMethod] 
[ExpectedException(typeof(ArgumentNullException))] 
     public void Repo_GetJobHistoryByNames_PassAllNull_ArgumenNullException() 
      { 
       ImySSystemHealthRepo repo = _mySSystemHealthRepo.Object; 

       //Act 
       var allJobs = repo.GetJobHistoryByName(default(DateTime), default(DateTime), null); 

       //Assert 

      } 

而我的实际执行情况是这样的。

public IEnumerable<JobHistory> GetJobHistoryByName(DateTime startDate, DateTime endDate,string jobName) 
     { 

      if (String.IsNullOrEmpty(jobName)) 
      { 
       throw new ArgumentNullException("jobName"); 
      } 

      var jobDetails = _context.JobHistories.Where(jh => jh.StartTime >= startDate && jh.EndTime <= endDate); 

      jobDetails = jobDetails.Where(jh=>jh.Name == jobName); 

      return jobDetails; 
     } 

编辑:

如果我不使用MOQ和传球方面为空,下面的方法将失败。

[TestMethod] 
    public void Repo_GetJobHistoryByNames_PassValid_GetAllRecordsBack() 
    { 

     mySYSSystemHealthRepo repo = new mySYSSystemHealthRepo(null); 

     //Act 
     var allJobs = repo.GetJobHistoryByName(DateTime.Parse("01 OCT 2017"), DateTime.Parse("30 OCT 2017"), "TestJob"); 
     var allEngineers = allJobs.Select(x => x.Engineer); 

     //Assert 
     Assert.AreEqual(3, allJobs.Count()); 
     Assert.IsTrue(allEngineers.Contains("supp")); 

    } 
+0

目前状态下的问题尚不清楚,因为它是不完整的。阅读[问],然后提供[mcve],可用于更好地理解您的问题。 – Nkosi

+0

另外你为什么嘲笑受试者?目标通常是模拟测试对象的依赖关系。 – Nkosi

+0

创建一个待测主题的实例。注入上下文并调用测试中的实际方法。根据所示的方法,空测试应该可以工作 – Nkosi

创建一个待测主题的实例。注入模拟的上下文和任何其他依赖关系,然后调用实际的待测方法。根据示出的方法中,空测试应该工作,然后

[TestMethod] 
[ExpectedException(typeof(ArgumentNullException))] 
public void Repo_GetJobHistoryByNames_PassAllNull_ArgumenNullException() { 
    //Arrange 
    ImySSystemHealthRepo repo = new MyActualSystemHealthRepo(context: null); 

    //Act 
    var allJobs = repo.GetJobHistoryByName(default(DateTime), default(DateTime), null); 

    //Assert 
    //...N/A 
} 

在第二个测试的情况下,上下文依赖性将需要被模拟返回假数据,然后注入到被测对象。

[TestMethod] 
public void Repo_GetJobHistoryByNames_PassValid_GetAllRecordsBack() { 
    //Arrange 
    var mockContext = new Mock<IMyContext>(); 
    mockContext.Setup(_ => _.JobHistories).Returns(allJobHistory); 

    var repo = new mySYSSystemHealthRepo(mockContext.Object); 

    //Act 
    var allJobs = repo.GetJobHistoryByName(DateTime.Parse("01 OCT 2017"), DateTime.Parse("30 OCT 2017"), "TestJob"); 
    var allEngineers = allJobs.Select(x => x.Engineer); 

    //Assert 
    Assert.AreEqual(3, allJobs.Count()); 
    Assert.IsTrue(allEngineers.Contains("supp")); 
} 

被调用的上下文将返回假集合,linq表达式应枚举它。

+0

这对当前问题起作用,因为我在使用上下文之前抛出空异常。如何使用上下文的其他方法(在编辑上发布的一个例子)?我怎样才能MoQ上下文,而不是null或我的实际上下文?对不起,如果我问了太多问题。 – Simsons