已经设置了方法的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"));
}
答
创建一个待测主题的实例。注入模拟的上下文和任何其他依赖关系,然后调用实际的待测方法。根据示出的方法中,空测试应该工作,然后
[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
目前状态下的问题尚不清楚,因为它是不完整的。阅读[问],然后提供[mcve],可用于更好地理解您的问题。 – Nkosi
另外你为什么嘲笑受试者?目标通常是模拟测试对象的依赖关系。 – Nkosi
创建一个待测主题的实例。注入上下文并调用测试中的实际方法。根据所示的方法,空测试应该可以工作 – Nkosi