C# 如何在Ms单元测试中使用Moq覆盖异常块
任何人都可以帮助我在MS单元测试中使用moq覆盖异常。 这是我的示例控制器方法C# 如何在Ms单元测试中使用Moq覆盖异常块,c#,visual-studio,unit-testing,c#-4.0,moq,C#,Visual Studio,Unit Testing,C# 4.0,Moq,任何人都可以帮助我在MS单元测试中使用moq覆盖异常。 这是我的示例控制器方法 [HttpPost] [Route("DeleteEnumeration")] public int DeleteEnumeration(TemplateDto template) { try { IUnityContainer container = new UnityContainer(); container
[HttpPost]
[Route("DeleteEnumeration")]
public int DeleteEnumeration(TemplateDto template)
{
try
{
IUnityContainer container = new UnityContainer();
container.RegisterType<DBFrameworkBL>();
container.RegisterType<DBFrameworkDal>();
container.RegisterType<IDBFrameworkDal, DBFrameworkDal>();
DBFrameworkBL objDBFrameworkBL = container.Resolve<DBFrameworkBL>();
return objDBFrameworkBL.DeleteEnumeration(template);
}
catch (Exception ex)
{
LogUtilities.LogException(ex);
return 0;
}
}
[HttpPost]
[路由(“删除枚举”)]
public int DeleteEnumeration(模板到模板)
{
尝试
{
IUnityContainer容器=新的UnityContainer();
container.RegisterType();
container.RegisterType();
container.RegisterType();
DBFrameworkBL objDBFrameworkBL=container.Resolve();
返回objDBFrameworkBL.DeleteEnumeration(模板);
}
捕获(例外情况除外)
{
LogUtilities.LogException(ex);
返回0;
}
}
这是我的样品测试方法
[TestMethod]
public void Test_DeleteEnumerationMocking()
{
TemplateDto template = new TemplateDto();
template.Template_Name = "Speed-enum.xml";
template.Template_Type = "Enumeration";
template = null;
Mock<IDBFrameworkBL> moq = new Mock<IDBFrameworkBL>(
MockBehavior.Strict);
moq.Setup(m => m.DeleteEnumeration(template)).Throws(new Exception());
DBFrameworkController dbFramewoek = new DBFrameworkController();
dbFramewoek.DeleteEnumeration(moq.Object, template);
}
[TestMethod]
公共无效测试\u DeleteEnumerationMocking()
{
TemplateDto template=新TemplateDto();
template.template_Name=“Speed enum.xml”;
template.template_Type=“枚举”;
模板=null;
模拟最小起重量=新模拟(
模仿行为(严格);
Setup(m=>m.DeleteEnumeration(模板)).Throws(newexception());
DBFrameworkController dbFramewoek=新的DBFrameworkController();
dbFramewoek.DeleteEnumeration(moq.Object,模板);
}
获取DeleteEnumeration不接受两个参数的错误。
既然我是c#的新手,有人能给我建议更好的解决方案或如何处理这个测试用例吗?测试中的方法有很多错误,因为它似乎混合了实现和交叉关注点。暗示了一些严重的设计缺陷 理想情况下,BL抽象应该注入控制器中,而不是局部解决。容器和所有依赖项注册都应该移动到合成根目录,保持控制器的简单
public class DBFrameworkController: ApiController {
private readonly IDBFrameworkBL objDBFrameworkBL;
public DBFrameworkController(IDBFrameworkBL objDBFrameworkBL) {
this.objDBFrameworkBL = objDBFrameworkBL;
}
[HttpPost]
[Route("DeleteEnumeration")]
public int DeleteEnumeration(TemplateDto template) {
try {
return objDBFrameworkBL.DeleteEnumeration(template);
} catch (Exception ex) {
LogUtilities.LogException(ex);
return 0;
}
}
}
这将允许测试模拟所需的行为,比如抛出异常
[TestMethod]
public void DeleteEnumeration_Should_Throw_Exception() {
//Arrange
var template = new TemplateDto();
template.Template_Name = "Speed-enum.xml";
template.Template_Type = "Enumeration";
var mock = new Mock<IDBFrameworkBL>(MockBehavior.Strict);
mock.Setup(_ => _.DeleteEnumeration(template)).Throws(new Exception());
var controller = new DBFrameworkController(mock.Object);
var expected = 0;
//Act
var actual = controller.DeleteEnumeration(template);
//Assert
Assert.AreEqual(expected, actual);
}
[TestMethod]
public void DeleteEnumeration\u应该\u抛出\u异常(){
//安排
var template=new TemplateDto();
template.template_Name=“Speed enum.xml”;
template.template_Type=“枚举”;
var mock=new mock(MockBehavior.Strict);
mock.Setup(=>quot.DeleteEnumeration(模板)).Throws(newexception());
var controller=新的DBFrameworkController(mock.Object);
预期风险值=0;
//表演
var实际值=controller.DeleteEnumeration(模板);
//断言
断言.AreEqual(预期、实际);
}