2016-05-23 105 views
0

我得到了一些依赖于Nlog输出的测试。我有managed to redirect the output到一个变量,所以我可以潜入字符串中找出是否一切正常。这样做肯定有更好的办法,但我找不到任何东西。基于nlog输出的功能测试

这里的测试和类被测试:

[TestFixture] 
public class ProcessMessagesFromQueues 
{ 
    private static string StuffLogged; 

    [SetUp] 
    public void Init() 
    { 
     StuffLogged = string.Empty; 
     RedirectNLog(); 
    } 

    private static void RedirectNLog() 
    { 
     MethodCallTarget target = new MethodCallTarget(); 
     target.ClassName = typeof(ProcessMessagesFromQueues).AssemblyQualifiedName; 
     target.MethodName = "LogMethod"; 
     target.Parameters.Add(new MethodCallParameter("${message}")); 

     NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Debug); 
    } 

    [Test] 
    public void GetNewSmsMessageWhenPublished() 
    { 
     // Subscribe 
     var sqs = FluentNotificationStack.Register(configuration => 
     { 
      configuration.Component = "privateapnworker"; 
      configuration.Environment = "qa28"; 
      configuration.Tenant = "uk"; 
     }); 

     sqs 
     .WithSqsTopicSubscriber() 
     .IntoQueue("") 
     .WithMessageHandler(new ConfigurationSmsHandler()) 
     .StartListening(); 

     // Publish 
     sqs.WithSnsMessagePublisher<ConfigurationSmsSent>(); 

     string fakeImei = DateTime.Now.ToLongTimeString(); 
     string expected = $"Configuration SMS captured! Imei: {fakeImei} status StatusOk{Environment.NewLine}"; 

     sqs.Publish(new ConfigurationSmsSent(fakeImei, "StatusOk")); 

     // Wait for it 
     Thread.Sleep(1000); 

     // 4. Compare the messages 
     StringAssert.Contains(expected, StuffLogged); 
    } 

    public static void LogMethod(string message) 
    { 
     StuffLogged += message + Environment.NewLine; 
    } 

} 

与输出的类别:

public class ConfigurationSmsHandler : IHandler<ConfigurationSmsSent> 
{ 
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); 

    public bool Handle(ConfigurationSmsSent message) 
    { 
     Logger.Info($"Configuration SMS captured! Imei: {message.Imei} status {message.Status}"); 
     return true; 
    } 
} 

回答

2

作为替代MethodCall目标,suggested通过Jeff Bridgman, 可以指定NLOG Memory-target 并验证目标中的输出。日志

MemoryTarget target = new MemoryTarget(); 
    target.Layout = "${message}"; 

    NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Debug); 

    Logger logger = LogManager.GetLogger("Example"); 
    logger.Debug("log message"); 

    foreach (string s in target.Logs) 
    { 
     Console.Write("logged: {0}", s); 
    }