2016-05-23 106 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); 
    }