如果我正在测试与错误相关的内容,我可能希望最初在控制台中查看消息或堆栈跟踪。在我对测试感到满意后,我通常不希望控制台中出现任何可能有助于快速发现和诊断失败测试的东西。但是,在重构时,有时再次输出附加信息很有用。所以我有很多关于我评论/取消评论的行,比如:
// System.Diagnostics.Debug.WriteLine(msg);
有什么更清洁的方法来做到这一点?
干杯,
绿柱石
=== 编辑
这是我的意思的一个示例,根据 Josh 的建议更新为使用日志服务。
作为单元测试,我想断言将向用户显示错误,在这种情况下,因为新部门的名称重复。我可以并且确实自动生成具有正确内容的消息。
该消息还必须通过无法自动化的基本气味测试 - 它是一个结构良好的句子,大多数用户会很快理解并知道如何修复吗?我不想启动 ui 并让用户确保它不是完全愚蠢的,所以我想通过打印出来来关注它。正如我之前提到的,这只是噪音,除了消息发生了几次变化。
[Test]
public void WhenThePropertyIsChanged_IfDuplicateIsFound_DuplicateNameIsPartOfBrokenRuleMessage()
{
const string newName = "Blah";
// force a duplicate
_dao.Stub(x => x.FindByName(newName)).Return(new Department(newName));
var vm = _masterVm.Departments.Last();
vm.Name = newName;
var msg = vm.GetBrokenRules().First().Description;
Log.Service.WriteLine(msg); <=== print it
Assert.That(msg, Is.StringContaining(newName));
Assert.That(vm.BrokenRules.First().Description, Is.EqualTo(msg));
}
最佳答案
将您的日志记录语句包装到服务中,并将代码包装到接口(interface)中。
public interface ILoggingService
{
void WriteLine(String msg);
}
创建一个允许访问日志服务的静态类,但允许您设置该服务。
internal static class Log
{
private static ILoggingService _loggingService;
internal static ILoggingService Service
{
get{ return _loggingService ?? (_loggingService = new DefaultLoggingService()); }
set{ _loggingService = value; }
}
}
现在,您可以仅在写入 Debug 流的测试中实现服务。
public class DebugLoggingService: ILoggingService
{
public void WriteLine(String msg)
{
System.Diagnostics.Debug.WriteLine(msg);
}
}
Log.Service = new DebugLoggingService();
您的代码现在可以保持不变,您只需通过注释掉那里的行来更改 DebugLoggingService。或者更好的是,您可以将其包装在
#if DEBUG ... #endif
中。陈述。
关于unit-testing - 单元测试控制台输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3374639/