首页 > 解决方案 > 在单元测试中尝试捕获依赖项?

问题描述

我对单元测试比较陌生,但我想开始对旧版 ASP NET MVC 应用程序进行单元测试。例如,我有函数 PrepareModel 可以做很多事情并且有多个依赖项。我在我的模型中添加了 newFeature 并创建了 myNewCode,以获取此功能。

public Model PrepareModel(){
  Model model = new Model();
  model.mainPropertie = getFromDataBase();
  
  model.someIrrelevantProperty1 = getValueFromSomeDependency();
  model.someIrrelevantProperty2 = getValueFromSomeDependency();
  
  model.newFeature = myNewCode();
  return model;
}

我想对正确获得 model.newFeature 的 PrepareModel() 进行单元测试。

我成功地模拟了数据库,但有很多不相关的依赖项。我没有太多时间来重构它们。

添加 try-catch 环绕与测试无关的功能是否可以接受? 也许将来我会在此功能中有下一个任务时将它们重构出来。

public static bool isTest { get; set; }
public Model PrepareModel(){
  Model model = new Model();
  model.mainPropertie = getFromDataBase();
  
  try{
    model.someIrrelevantProperty1 = getValueFromSomeDependency();
    model.someIrrelevantProperty2 = getValueFromSomeDependency();
  } 
  catch(Exception ex) {
    if (!isTest)
      throw ex;
  }
  
  model.newFeature = myNewCode();
  return model;
}

如果这不可接受,我该怎么办?

标签: c#unit-testing

解决方案


有更好的方法来做到这一点。看,你已经isTest公开了你的变量——这很危险。该问题的更好解决方案是在您的解决方案中创建新配置并将其称为 TEST。接下来在您的测试应用程序中,只需将 TEST 添加到定义中。在您的代码中:

public Model PrepareModel(){
  Model model = new Model();
  model.mainPropertie = getFromDataBase();
  
#if !TEST
  model.someIrrelevantProperty1 = getValueFromSomeDependency();
  model.someIrrelevantProperty2 = getValueFromSomeDependency();
#endif
  
  model.newFeature = myNewCode();
  return model;
}

当然,这假设测试只能在 TEST 配置中运行*

如果您不知道我所说的“配置”是什么意思,那只是 DEBUG 和 RELEASE 之外的另一个。


推荐阅读