如何为实现抽象 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 的实体,这样您就可以根据需要注入不同的行为。