如何将Mock创建为实现抽象类的类

时间:2015-02-23 13:37:55

标签: 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 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类,我需要单独测试每个类,所以如何才能将这些代码解耦为可能呢?

由于

1 个答案:

答案 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的类,以便在需要时注入不同的行为。