如何模拟 StringBuilder class

How to mock the StringBuilder class

根据 this answer,我想知道如何模拟 StringBuilder class。他们嘲笑控制台的方式 class 非常棒:

您需要一个接口来定义您的依赖项:

public interface IConsoleService
{
    string ReadLine();
    void WriteLine(string message);
}
You create a default implementation for it:

public class ConsoleService : IConsoleService
{
    public string ReadLine()
    {
        return Console.ReadLine();
    }

    public void WriteLine(string message)
    {
        Console.WriteLine(message);
    }
}

模拟 StringBuilder.Append 方法的方法是什么?

到目前为止我得到的是:

public interface IStringBuilderService
{
    string Append(string line);
    StringBuilder s
}

public class StringBuilderService : IStringBuilderService
{
    public string Append(string line)
    {
        return this.ToString() += line;
    }
}

即使很少需要模拟 StringBuilder,我假设您出于试用目的需要它..所以这是一种模拟它的可能方法。

您的默认实现 class 需要包装 StringBuilder.

的实例
public interface IStringBuilderService
{
  IStringBuilderService Append(string line); // mimic the StringBuilder Append signature
  StringBuilder S { get; }
 }

public class StringBuilderService : IStringBuilderService
{
    private StringBuilder _actualStringBuilder;

    public StringBuilder S
    {
     get { return _actualStringBuilder; }
    }  

    public StringBuilderService() // you could also take in a parameter if you wish to initialize the variable
    {
     _actualStringBuilder = new StringBuilder();
    } 

    public IStringBuilderService Append(string line)
    {
        _actualStringBuilder.Append(line);
        return this; 
    }

    public override string ToString()
    {
     return _actualStringBuilder.ToString();
    }
}

我们需要将 StringBuilder 的实例包裹在具体 class 中的原因是因为 Console 是静态资源,因此无需实例变量即可访问。 StringBuilder 将是每个实例,因此我们需要一个封装它的变量。

一旦你有了这个界面,你就可以在任何需要StringBuilder操作的地方使用这个界面。

对于您的测试,您可以使用此接口的模拟。