我目前正在编写一个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方法中添加很多代码来“伪造”输出,但如果可能的话,我想避免这种情况。如果这是推荐的方式,我可以为自己创建一个脚本来创建所有可能的输出。有另一种方法吗?
要验证码“的服务交互正确”,你的实际需要集成测试(代码和服务必须集成)。但是,除了术语之外,我同意你的回答:你必须测试你的代码(可能与“他们的”代码集成)而不是“他们的”代码。 – igorrs