【问题标题】:Mock function not throwing exception in c# unit test模拟函数在 C# 单元测试中不抛出异常
【发布时间】:2020-10-02 09:04:06
【问题描述】:

这是我的单元测试方法

        [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() 方法应该返回 SqlException 而不是返回 null。在控制器方法var result 中总是得到null。任何建议都赞赏它为什么不起作用。我想通过GetDealerStatus() 抛出SqlException。 这里是调试模式result值图

【问题讨论】:

  • x.GetDealerStatus(new System.Net.Http.HttpRequestMessage()) => x.GetDealerStatus(It.IsAny&lt;System.Net.Http.HttpRequestMessage&gt;()).

标签: c# unit-testing exception moq


【解决方案1】:

您应该在Setup 使用It.IsAny&lt;System.Net.Http.HttpRequestMessage&gt;() 而不是new System.Net.Http.HttpRequestMessage()。因为您为System.Net.Http.HttpRequestMessage 的具体实例配置了您的方法,所以在测试时它并不相同。

【讨论】:

    【解决方案2】:

    可能是匹配器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)
    

    如果您想从“任意”缩小匹配条件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 2015-06-04
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多