Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为实现抽象类的类创建Mock_C#_.net_Unit Testing_Mocking - Fatal编程技术网

C# 如何为实现抽象类的类创建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

我有上面的例子,我需要解耦代码以简化测试,如何使用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 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
方法注入一个类?谢谢你的回答。