我正在以一种不会在生产代码中留下“测试钩子(Hook)”的方式寻找一些关于单元测试的建议。

假设我有一个名为 MethodLogger 的静态类(VB.NET 模块),它有一个“void WriteEntry(string Message)”方法,旨在将调用方法和消息写入磁盘上的日志文件。 WriteEntry() 的实际目标可以转移到 IMethodLogger 的假实现以运行单元测试和 全部 其他情况它应该调用 IMethodLogger 的真正实现。

以下是我到目前为止所做的一个粗略的处理,我喜欢这种方法——但在一些快速测试中,它会引发一些问题和疑虑:

[InternalAttributesVisibleTo("MethodLogger.Tests")] 
internal static class MethodLogger 
{ 
    public void WriteEntry(string message) 
    { 
        LogWriter.WriteEntry(message); 
    } 
 
    private IMethodLogger LogWriter 
    { 
        get; 
        set; 
    } 
 
#if DEBUG 
    internal void SetLogWriter(IMethodLogger logger) 
    { 
        LogWriter = logger; 
    } 
#endif 
} 

这是我的具体问题:
  • 这将单元测试与针对 DEBUG 构建运行紧密结合;当我运行单元测试时,尽管它似乎并没有专门在 DEBUG 中重建被测程序集 - 是否可以这样做?
  • 我会想要针对非调试版本运行单元测试吗?在我的脑海中,我看到的值(value)更少——但会有吗?
  • 我可以使用“TEST”之类的自定义预编译器标志来代替“DEBUG”吗?我将如何告诉 Visual Studio 始终使用此标志重建目标以进行测试以确保我的钩子(Hook)/接缝可用?
  • 请您参考如下方法:

    您可以使用 Typemock Isolator 来规避任何损害可测试性的设计问题。
    与其他框架不同,它还可以使用静态方法、私有(private)方法和非虚拟方法。
    当您学习更好的设计时,默认情况下您的代码将更加“可测试”,
    但是,如果您现在只想解决这些问题,这将有所帮助

    http://blog.typemock.com/2009/01/isolator-new-vbnet-friendly-api.html

    (此外,它是唯一具有 VB 友好 API 的工具)


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!