任何人都可以帮助我解决使用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可以为我提供更好的解决方案或如何修剪此测试用例的建议。
答案 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);
}