幻数 - 从配置文件读取与全局空间相同?单元测试不好?

Fin*_*las 0 c# unit-testing

考虑以下课程:

class Something : ISomething {

    public void DoesSomething(int x) {
        if (x == 0) {
            x = 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我当然要删除神奇的数字 - 我的单元测试正在通过等...但我想重构可怕的魔法数字.

我正在使用C#,但我想这个问题非常通用.从配置文件(xml文件)读取是通过以下方式完成的:

ConfigurationManager.AppSettings["MyOldMagicNumber"]...
Run Code Online (Sandbox Code Playgroud)

当然,这将是一个测试的草皮.我可以轻松地在这个标记为虚拟的类中创建一个私有函数.其目的是封装上面的代码.这将允许我在我的单元测试中访问以覆盖和插入我自己的值.

我的问题是 -

这是不是我在做什么?见标题.

编辑:

这是一个游戏 - 因此很可能在开发过程中价值观会经常变化,重新构建将是一件苦差事.我应该提到的是,上面的代码是通用的,我这样做是为了让问题尽可能简单.虽然有点上下文 - '0'是游戏区域的界限.

提前致谢.

Ken*_*son 5

为什么不为此创建一个接口

public interface IApplicationSettings {
 int MyOldMagicNumber { get; }
}
Run Code Online (Sandbox Code Playgroud)

然后有两个这样的实现,一个用于生产,从配置文件中读取,一个用于单元测试.

public class ApplicationSettings : IApplicationSettings {
 public int MyOldMagicNumber { 
   get { return ConfigurationManager.AppSettings["MyOldMagicNumber"]; }
  }
}

public class FakeApplicationSettings : IApplicationSettings {
 public int MyOldMagicNumber { 
   get { return 87; /*Or whatever you want :) */ }
  }
}
Run Code Online (Sandbox Code Playgroud)