带有抛出的 catch 语句中的单元测试代码



有没有办法在 catch 语句中测试代码,诀窍是 catch 以throw结尾,这就是事情横向发展的地方。所以问题是,有没有办法在运行我的测试方法时避免这种抛出,或者在我的测试中适应它?

下面的方法只是简单地更新值,并且在捕获时它有一个throw

public void UpdateCase(LinqToSQLModelName record, IProgress<string> statusReporter)
{
try
{
statusReporter.Report(record.Reference);
_service.PushToService(record);
record.ProcessedDate = DateTime.Now;
record.StatusId = (int)Status.Processed;
}
catch (Exception ex)
{
record.StatusId = (int)Status.Fail;
record.ErrorExceptions = ex.StackTrace;
record.ProcessedDate = DateTime.Now;
Result = false;
throw ex;//How do dodge this when running my test/ Accomodate it on my Test
}
finally
{
_db.SubmitChanges();
}
}

我现在需要测试捕获部分,在下面测试

[TestMethod()]
public void UpdateCaseErrorTest()
{
var repository = new Mock<IDataContext>();
var errorLoggerRepository = new Mock<IExceptionLogger>();
var serviceRepository = new Mock<IServiceInterface>();
repository.Setup(m => m.Get()).Returns(new 
ManualWithDrawDataContext());
repository.Setup(m => m.GetCouncilRefundRecord())
.Returns(new LinqToSQLModelName
{
refrence= "10",
Reason = "Reason",
DateCaptured = DateTime.Now,
});
var sut = new DataContext(repository.Object.Get(), serviceRepository.Object, errorLoggerRepository.Object);
sut.UpdateCase(repository.Object.GetCouncilRefundRecord(), null);//This null allows me to go to the catch
Assert.IsFalse(sut.Result);
}

不,你不可能跳过捕获的抛出语句。但是,可以附加单元测试方法之上的ExpectedExceptionAttribute,以便它指示在测试方法执行期间会出现异常。您可以在此处阅读有关ExpectedExceptionAttribute的信息。

[TestMethod()]
[ExpectedException(typeof(Exception))]
public void UpdateCaseErrorTest()
{
var repository = new Mock<IDataContext>();
var errorLoggerRepository = new Mock<IExceptionLogger>();
var serviceRepository = new Mock<IServiceInterface>();
repository.Setup(m => m.Get()).Returns(new 
ManualWithDrawDataContext());
repository.Setup(m => m.GetCouncilRefundRecord())
.Returns(new LinqToSQLModelName
{
refrence= "10",
Reason = "Reason",
DateCaptured = DateTime.Now,
});
var sut = new DataContext(repository.Object.Get(), serviceRepository.Object, errorLoggerRepository.Object);
sut.UpdateCase(repository.Object.GetCouncilRefundRecord(), null);//This null allows me to go to the catch
Assert.IsFalse(sut.Result);
}

另外,我建议不要捕获一般异常,而是定义具有特定异常的属性。

还有另一种方法可以在xunit中使用Record.Exception执行此操作,并在链接下方查看更多信息:

如何测试使用 xUnit、SubSpec 和 FakeItEasy 引发的异常

最新更新