如何在女士单元测试中使用Moq覆盖异常块

时间:2018-07-24 06:38:46

标签: c# visual-studio unit-testing c#-4.0 moq

任何人都可以帮助我解决使用MS Unit Test中的moq覆盖异常的问题。 这是我的Sample Controller方法

[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;
        }

    }

这是我的示例测试方法

  [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);
    }

得到一个错误,即DeleteEnumeration并没有两点争论。 自从C#刚问世以来,anyuone可以为我提供更好的解决方案或如何修剪此测试用例的建议。

1 个答案:

答案 0 :(得分:1)

被测方法有很多错误,因为它似乎将实现与跨领域关注混为一谈。提示一些严重的设计缺陷。

理想情况下,应该将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);
}