模拟函数不会在 C# 单元测试中抛出异常

Mock function not throwing exception in c# unit test

这是我的单元测试方法

        [Fact]
        public void DealerSmsStatusTestTest_MustReturnInternalServerErrorIfMockMethodFails()
        {
            //Arrange
            Mock<DBClass.IDealer> mock = new Mock<DBClass.IDealer>();
            var exception = FormatterServices.GetUninitializedObject(typeof(System.Data.SqlClient.SqlException));
            mock.Setup(x => x.GetDealerStatus(new System.Net.Http.HttpRequestMessage()))
                .Throws((System.Data.SqlClient.SqlException)exception);

            DealerSettingController controller = new DealerSettingController(mock.Object);
            
            //Act
            var result = controller.DealerSmsStatus();
   
            //Assert
         /*I will do assertion here*/

        }

这是我的控制器方法

public IHttpActionResult DealerSmsStatus()
        {
            try
            {
                var result = _dealer.GetDealerStatus(Request);
                return Json(new Models.Response(
                            Models.ResponseMessages.Success,
                            result)
                         );
            }
            catch (System.Data.SqlClient.SqlException)
            {
                return InternalServerError();
            }
            catch (System.Exception ex)
            {
                Logger.Error(ex, ex.Message, ex.StackTrace);
                return InternalServerError();
            }

        }

当我调试测试时,GetDealerStatus() 方法应该 return SqlException 而不是 returns null。在控制器方法 var result 中总是得到 null。任何建议都赞赏为什么它不是 working.I 想通过 GetDealerStatus() 抛出 SqlException。 这是调试模式result 值图像

您应该在 Setup 处使用 It.IsAny<System.Net.Http.HttpRequestMessage>() 而不是 new System.Net.Http.HttpRequestMessage()。因为您为 System.Net.Http.HttpRequestMessage 的具体实例配置了方法,所以在测试时它不一样。

可能是匹配器x.GetDealerStatus(new System.Net.Http.HttpRequestMessage())

new System.Net.Http.HttpRequestMessage() 创建一个 HttpRequestMessage 的新实例,它将不等于您在 SUT 中传递给 GetDealerStatusRequest

通常你会使用类似的东西:

x.GetDealerStatus(It.IsAny<System.Net.Http.HttpRequestMessage>())

It.Is<System.Net.Http.HttpRequestMessage>(x => whatever specific equality conditions you want to match on)

如果你想缩小匹配条件从 'any'