public void Log_Error_EmitsExpectedEvent() { Exception ex = new Exception("Kaboom"); string message = "TestMessage"; string functionInvocationId = Guid.NewGuid().ToString(); string activityId = Guid.NewGuid().ToString(); string properties = null; _mockEventGenerator.Setup(p => p.LogAzureMonitorDiagnosticLogEvent(LogLevel.Error, _websiteHostName, AzureMonitorDiagnosticLogger.AzureMonitorOperationName, AzureMonitorDiagnosticLogger.AzureMonitorCategoryName, _regionName, It.IsAny <string>())) .Callback <LogLevel, string, string, string, string, string>((t, r, o, c, l, p) => { // Store off the properties for later validation properties = p; }); // use no scope using (CreateScope()) { _logger.LogError(ex, message); } _mockEventGenerator.VerifyAll(); var level = LogLevel.Error; JObject actual = JObject.Parse(properties); JObject expected = JObject.FromObject(new { appName = _appServiceOptionsWrapper.CurrentValue.AppName, roleInstance = _roleInstance, exceptionType = ex.GetType().ToString(), exceptionMessage = ex.Message, exceptionDetails = ex.ToFormattedString(), message, category = _category, hostInstanceId = _hostInstanceId, hostVersion = ScriptHost.Version, level = level.ToString(), levelId = (int)level, processId = _processId }); Assert.True(JToken.DeepEquals(actual, expected), $"Actual: {actual.ToString()}{Environment.NewLine}Expected: {expected.ToString()}"); }