模拟函数不会在 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 中传递给 GetDealerStatus
的 Request
。
通常你会使用类似的东西:
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'
这是我的单元测试方法
[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 中传递给 GetDealerStatus
的 Request
。
通常你会使用类似的东西:
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'