【问题标题】:How to mock the StringBuilder class如何模拟 StringBuilder 类
【发布时间】:2016-02-15 01:31:29
【问题描述】:

根据this answer,我想知道如何模拟 StringBuilder 类。他们嘲笑 Console 类的方式很棒:

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

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;
    }
}

【问题讨论】:

  • 为什么?我不明白嘲讽在这里给你带来了什么。这是一个库类;不跨越国界。
  • @duffymo 练习
  • 不好的做法对你没有好处。只会养成坏习惯。首先我们养成习惯;然后我们的习惯造就了我们。节省您的精力并学习如何正确模拟。
  • @duffymo 太好了,你能推荐一个开始的地方吗?
  • 阅读您喜欢使用的模拟库的文档。我可以告诉你不要看 - 不要嘲笑 StringBuilder。

标签: c# .net visual-studio unit-testing nunit


【解决方案1】:

尽管很少需要模拟 StringBuilder,但我假设您需要它来进行试用。所以这是模拟它的一种可能方法。

您的默认实现类需要包装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 的实例包装在具体类中的原因是因为Console 是静态资源,因此无需实例变量即可访问。 StringBuilder 将是每个实例,因此我们需要一个封装它的变量。

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

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

【讨论】:

  • 这看起来很糟糕,yaar
  • IStringBuilderService 会是什么样子?和我一样吗?
  • 添加了接口的定义。为了一致性起见,接口的 append 方法需要模仿 StringBuilder 的定义(没有硬性规则),除了 StringBuilder,IStringBuilderService 是我们的抽象,所以我们'会返回的。
  • @PleaseStopUpvotingMe 修复了 ToString() 的返回类型错误
  • 谢谢。当您说“您的默认实现类需要包装 StringBuilder 的实例”时。 ---- 这是否意味着我需要使用 stringbuilderservice 类而不是 stringbuilder?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 2015-11-06
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多