[英]How to create Mock to a class that implement an abstract class
我有上面的示例,我需要解耦代碼以簡化測試,我該怎么做才能使用模擬進行測試?
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類的類,我需要分別測試每個類,所以我如何才能使這些代碼脫鈎,從而做到這一點?
謝謝
與其從類繼承,不如使用接口注入它。
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
其他類,以便在需要時注入不同的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.