NUnit&;MOQ:测试在捕获异常时调用另一个方法的try-catch

NUnit&;MOQ:测试在捕获异常时调用另一个方法的try-catch,nunit,moq,Nunit,Moq,我知道MOQ框架并不是为了在这种情况下提供帮助而设计的,但也许您可以提供帮助 我有一个方法,它使用try/catch,在抛出异常时调用通知方法。我试图做的是创建一个集成/单元测试,检查是否在抛出任何异常时调用SendNotification 试验方法: public virtual void MonitorIntradayBuilds(IIntradayBuilds intradayBuilds) { try { var intradayBuildFound =

我知道MOQ框架并不是为了在这种情况下提供帮助而设计的,但也许您可以提供帮助

我有一个方法,它使用try/catch,在抛出异常时调用通知方法。我试图做的是创建一个集成/单元测试,检查是否在抛出任何异常时调用SendNotification

试验方法:

public virtual void MonitorIntradayBuilds(IIntradayBuilds intradayBuilds)
{
    try
    {
        var intradayBuildFound = intradayBuilds.CheckForIntradayBuilds();
        if (intradayBuildFound && !IntradayBuildsComplete && !DailyBuildsFound)
        {
            IntradayBuildsComplete = intradayBuilds.StartIntradayBuilds();
            //should start daily builds?
        }
    }
    catch (Exception ex)
    {
        SendNotification("MonitorIntradayBuilds threw an exception", ex);
    }
}
测试用例:

    [Test]
    public void it_should_notify_developers_immediately_if_there_is_a_problem_when_checking_for_intraday_builds()
    {
        //Arrange
        var mockDua = new Mock<DUA>();
        var mockIB = new Mock<IIntradayBuilds>();

        //Act
        mockIB.Setup(x => x.CheckForIntradayBuilds()).Throws(new Exception());
        mockDua.Object.MonitorIntradayBuilds(mockIB.Object);

        //Assert
        mockDua.Verify(x => x.SendNotification(It.IsAny<string>(), It.IsAny<Exception>()), Times.Once);
    }
[测试]
public void it\u检查日内构建()时,如果出现问题,应立即通知开发者
{
//安排
var mockDua=new Mock();
var mockIB=new Mock();
//表演
mockIB.Setup(x=>x.CheckForIntradayBuilds()).Throws(newexception());
mockDua.Object.MonitorIntradayBuilds(mockIB.Object);
//断言
验证(x=>x.SendNotification(It.IsAny(),It.IsAny()),次.Once);
}
我一直在点击Moq.MockException,然后看到SendNotification“期望对mock进行一次调用,但被调用了0次…”

我尝试在测试用例上使用[ExpectedException]属性,但没有效果。它使测试通过,但仍然不调用SendNotification方法

有什么想法吗?

解决了

事实证明,您需要在正在模拟的测试系统上设置CallBase属性

测试用例现在是:

    [Test]
    public void it_should_notify_developers_immediately_if_there_is_a_problem_when_checking_for_intraday_builds()
    {
        //Arrange
        var mockDua = new Mock<DUA>();
        var mockIB = new Mock<IIntradayBuilds>();
        mockDua.CallBase = true; // <<<< Added this line!

        //Act
        mockIB.Setup(x => x.CheckForIntradayBuilds()).Throws(new Exception());
        mockDua.Object.MonitorIntradayBuilds(mockIB.Object);

        //Assert
        mockDua.Verify(x => x.SendNotification(It.IsAny<string>(), It.IsAny<Exception>()), Times.Once);
    }
[测试]
public void it\u检查日内构建()时,如果出现问题,应立即通知开发者
{
//安排
var mockDua=new Mock();
var mockIB=new Mock();
mockDua.CallBase=true//