C# 如何为实现抽象类的类创建Mock
我有上面的例子,我需要解耦代码以简化测试,如何使用mock进行测试C# 如何为实现抽象类的类创建Mock,c#,.net,unit-testing,mocking,C#,.net,Unit Testing,Mocking,我有上面的例子,我需要解耦代码以简化测试,如何使用mock进行测试 public sealed class XCommand : BaseCommand { public IResult Author() { //DO SOMETHING AND RETURN BASE. return base.run(); } } public abstract class BaseCommand { public virtu
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 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
的其他类,以便在需要时可以注入不同的行为。您所说的“如何解耦此代码”是什么意思?现在什么是不解耦的?我需要创建一个模拟来测试这样的东西。XCommand命令=新的XCommand();,但这里总是会尝试执行一个进程,有时没有应用程序来执行。你能理解吗?创建一个mock which sub-classes BaseCommand有什么错?为什么不让Author
成为一个虚拟方法,你可以在测试类中重写它?为什么不使用基类而不是用Run
方法注入一个类?谢谢你的回答。