【问题标题】:How to create Mock to a class that implement an abstract class如何为实现抽象类的类创建 Mock
【发布时间】:2015-02-23 13:37:55
【问题描述】:

我有上面的例子,我需要解耦代码以简化测试,我怎样才能做到这一点才能使用 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 类,我需要单独测试每个类,那么我如何解耦这段代码才能做到这一点?

谢谢

【问题讨论】:

  • “我如何解耦这段代码”是什么意思?什么现在没有解耦?
  • 我需要创建一个模拟来测试这样的东西。 XCommand command = new XCommand();,但是这里总是会尝试执行一个进程,有时没有app可以执行。你能理解吗?
  • 创建一个子类 BaseCommand 的模拟有什么问题?
  • 为什么不将Author 设为可以在测试类中覆盖的虚拟方法?
  • 为什么不使用Run 方法注入一个类而不是使用基类?

标签: c# .net unit-testing mocking


【解决方案1】:

我不会从类继承,而是使用接口注入它。

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

【讨论】:

  • 非常感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多