【发布时间】:2011-08-18 21:14:50
【问题描述】:
我目前正在用 C# 编写一个 Windows 服务,该服务将负责托管 WCF 服务。当调用服务操作时,我的服务将执行一个命令行应用程序,对 StandardOutput 进行一些数据处理并返回结果。此命令行应用程序更改服务器上其他第三方服务的状态。
这是我真正能够从头开始的罕见情况,所以我想以一种可以轻松进行单元测试的方式正确设置它。没有遗留代码,所以我有一张白纸。我正在苦苦挣扎的是如何使我的服务可单元测试,因为它几乎完全依赖于外部应用程序。
我的服务操作与命令行应用程序执行的操作的比例大致为 1:1。如果您没有猜到,我正在构建一个工具来允许远程管理仅提供 CLI 管理的服务。
这只是单元测试麻烦多于其价值的情况吗?为了提供一些背景信息,下面是我的概念验证应用程序中的一个快速示例。
private string RunAdmin(String arguments)
{
try
{
var exe = String.Empty;
if (System.IO.File.Exists(@"C:\Program Files (x86)\App\admin.exe"))
{
exe = @"C:\Program Files (x86)\App\admin.exe";
}
else
{
exe= @"C:\Program Files\App\admin.exe";
}
var psi = new System.Diagnostics.ProcessStartInfo
{
FileName = exe,
UseShellExecute = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
};
psi.Arguments = String.Format("{0} -u {1} -p {2} -y", arguments, USR, PWD);
var adm= System.Diagnostics.Process.Start(psi);
var output = fmsadmin.StandardOutput.ReadToEnd();
return output;
}
catch (Exception ex)
{
var pth =
System.IO.Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
"FMSRunError.txt");
System.IO.File.WriteAllText(pth, String.Format("Message:{0}\r\n\r\nStackTrace:{1}", ex.Message, ex.StackTrace));
return String.Empty;
}
}
public String Restart()
{
var output = this.RunAdmin("/restart");
return output; // has cli tool return code
}
如果不向我的 RunAdmin 方法添加大量“测试”代码,有没有办法对此进行单元测试?显然,我可以在 RunAdmin 方法中添加大量代码来“伪造”输出,但如果可能的话,我想避免这种情况。如果这是推荐的方式,我可能可以为自己创建一个脚本来创建所有可能的输出。还有其他方法吗?
【问题讨论】:
标签: c# .net unit-testing