C# 如何在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

任何人都可以帮助我在MS单元测试中使用moq覆盖异常。 这是我的示例控制器方法

[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(预期、实际);
}