我有上面的例子,我需要解耦代码以简化测试,我怎么能做到这一点可以使用mock进行测试?
public sealed class XCommand : BaseCommand
{
public IResult Author()
{
//DO SOMETHING AND RETURN BASE.
return base.run();
}
}
public abstract class BaseCommand
{
public virtual IResult Run()
{
ProcessStartInfo startInfo = new ProcessStartInfo();
using (Process process = new Process() { StartInfo = startInfo })
{
process.Start();
process.WaitForExit();
String error = process.StandardError.ReadToEnd().Trim();
String output = process.StandardOutput.ReadToEnd().Trim();
return new Result()
{
Error = error,
Output = output
};
}
}
}
sealed class Result : IResult
{
public String Error { get; set; }
public String Output { get; set; }
}
有很多类将继承BaseCommand类,我需要单独测试每个类,所以如何才能将这些代码解耦为可能呢?
由于
答案 0 :(得分:2)
不是继承自类,而是使用接口注入它。
public sealed class XCommand
{
IHaveARunMethod runClass;
public XCommand(IHaveARunMethod classWithRunMethod)
{
runClass = classWithRunMethod;
}
public IResult Author()
{
//DO SOMETHING AND RETURN BASE.
return runClass.run();
}
}
public interface IHaveARunMethod
{
IResult Run();
}
public class HasRunMethod : IHaveARunMethod
{
public IResult Run()
{
//Your run code here.
}
}
然后你可以模拟IHaveARunMethod
接口并将其注入XCommand
类。
然后你可以像这样使用它
var command = new XCommand(CreateMockedOfIHaveARunMethod());
您甚至可以创建其他实现IHaveARunMethod
的类,以便在需要时注入不同的行为。