如果你想要一些单元可测试的东西,它应该对一个抽象至少和它的实现一样严格。
通常你会通过你的类的构造函数或属性方法来获得依赖关系。一般来说,构造函数是首选,因为现在您的类的使用者在编译时知道需要哪些依赖关系。
public void int Main(string[] args)
{
// Validate the args are valid (not shown).
var config = new AppConfig();
config.Value1 = args[0];
config.Value2 = int.Parse(args[1]);
// etc....
}
public class MyService()
{
private AppConfig _config;
public MyService(AppConfig config)
{
this._config = config;
}
}
我通常不把配置对象放在接口后面,因为它只有数据 - 这是可序列化的。只要它没有方法,那么我就不需要用override
-d行为替换它。我也可以直接在我的测试中使用new
。
另外,我从来没有遇到过一种情况,当我想依靠抽象的命令行参数本身到一个服务 - 为什么它需要知道它在命令行后面?我得到的最接近的是使用PowerArgs来轻松解析,但我会在Main
中使用该权利。我通常做的事情就像是在命令行参数中读取Web服务器的端口号(我让应用程序的用户选择,以便我可以在同一台计算机上运行多个Web服务器副本 - 可能不同版本等我可以运行自动化测试,而我正在调试,而不是冲突端口),直接在我的Main
类解析它们。然后,在我的Web服务器中,我依赖于解析的命令行参数,在这种情况下是int
。这样,配置来自命令行的事实是无关紧要的 - 如果我愿意,我可以稍后将它移动到App.config
文件(它也基本上绑定到进程的生命周期) - 然后我可以将常见配置提取到configSource
文件。
通常将命令行和依赖关系抽象为一个强类型对象,而不是依赖于命令行的抽象(每个服务将消耗必须重新解析,如果保持纯的话) - 也许是应用级配置类和测试级配置类,并根据需要引入多个配置对象 - (应用程序不一定会在意这一点,而E2E测试基础架构需要在App.config
的单独部分中使用这个:我从哪里获取客户端静态文件,在哪里获取测试或开发人员环境中的构建脚本以自动生成/自动更新index.html文件等)。
你可以发布你到目前为止尝试过的代码吗? – ManoDestra
你有没有尝试过使用Moq?你可以使任何方法返回任何你想要的。 – Wjdavis5
@ Wjdavis5我尝试模拟实际的类而不是接口,但尝试过不好的经验。但是,一些不同的解决方案来了,改变了逻辑我实际上是单元测试,可以应用moq来。 – lentinant