TDD - 提取界面或使方法成为虚拟

Seb*_*raf 2 c# tdd

每当我想在一个简单的类中存根方法时,我经常提取一个接口.现在,如果该类的构造函数是公共的并且不是太复杂或依赖于复杂类型,那么它将具有相同的效果,只需使该方法成为虚拟和继承.这比提取界面更可取吗?如果是这样,为什么?

编辑:

class Parser
{
    public IDictionary<string, int> DoLengthyParseTask(Stream s)
    {
        // is slow even with using memory stream
    }
}
Run Code Online (Sandbox Code Playgroud)

有两种方法:提取接口或使方法成为虚拟.我实际上更喜欢接口,但这可能会导致IParser Parser元组爆炸......

Rya*_*tes 5

您需要考虑在单元测试之外要完成的任务.不要让你的工具决定你的设计.

处理接口可以帮助解耦代码,但这些应该是代码中自然的分离点(例如业务逻辑或数据访问).如果要继承并覆盖这些方法,使方法虚拟是有意义的.

你的情况,我会尝试测试行为使用DoLengthyParseTask而不是直接的方法.这将提供更强大的测试套件.您需要仔细考虑此方法是否确实需要公开(这意味着它可以并且应该在其自己的程序集之外引用).