簡體   English   中英

如何為實現抽象類的類創建Mock

[英]How to create Mock to a class that implement an abstract class

我有上面的示例,我需要解耦代碼以簡化測試,我該怎么做才能使用模擬進行測試?

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類的類,我需要分別測試每個類,所以我如何才能使這些代碼脫鈎,從而做到這一點?

謝謝

與其從類繼承,不如使用接口注入它。

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其他類,以便在需要時注入不同的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM