如何为实现抽象 class 的 class 创建 Mock
How to create Mock to a class that implement an abstract class
我有上面的例子,我需要解耦代码以简化测试,我该怎么做才能使用 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; }
}
有很多 class 将继承 class BaseCommand,我需要单独测试每个 class,所以我如何解耦这段代码才能使它成为可能?
谢谢
我不会从 class 继承,而是使用接口注入它。
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.
}
}
然后就可以Mock IHaveARunMethod
接口注入到XCommand
class.
那你就可以这样用了
var command = new XCommand(CreateMockedOfIHaveARunMethod());
您甚至可以创建其他 class 实现 IHaveARunMethod
的实体,这样您就可以根据需要注入不同的行为。
我有上面的例子,我需要解耦代码以简化测试,我该怎么做才能使用 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; }
}
有很多 class 将继承 class BaseCommand,我需要单独测试每个 class,所以我如何解耦这段代码才能使它成为可能?
谢谢
我不会从 class 继承,而是使用接口注入它。
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.
}
}
然后就可以Mock IHaveARunMethod
接口注入到XCommand
class.
那你就可以这样用了
var command = new XCommand(CreateMockedOfIHaveARunMethod());
您甚至可以创建其他 class 实现 IHaveARunMethod
的实体,这样您就可以根据需要注入不同的行为。