public async Task ProcessDuplicateC2DMessageTest() { // Arrange var identity = Mock.Of <IModuleIdentity>(m => m.DeviceId == "device1" && m.Id == "device1"); var cloudProxy = new Mock <ICloudProxy>(); cloudProxy.Setup(c => c.SendFeedbackMessageAsync(It.IsAny <string>(), It.IsAny <FeedbackStatus>())) .Returns(Task.CompletedTask); var edgeHub = Mock.Of <IEdgeHub>(); var underlyingDeviceProxy = new Mock <IDeviceProxy>(); underlyingDeviceProxy.Setup(d => d.SendC2DMessageAsync(It.IsAny <IMessage>())).Returns(Task.CompletedTask); var connMgr = new Mock <IConnectionManager>(); connMgr.Setup(c => c.AddDeviceConnection(It.IsAny <IIdentity>(), It.IsAny <IDeviceProxy>())); connMgr.Setup(c => c.GetCloudConnection(It.IsAny <string>())).Returns(Task.FromResult(Option.Some(cloudProxy.Object))); var deviceMessageHandler = new DeviceMessageHandler(identity, edgeHub, connMgr.Object, DefaultMessageAckTimeout, Option.None <string>()); deviceMessageHandler.BindDeviceProxy(underlyingDeviceProxy.Object); string lockToken = Guid.NewGuid().ToString(); var systemProperties1 = new Dictionary <string, string> { [SystemProperties.LockToken] = lockToken }; var message1 = Mock.Of <IMessage>(m => m.SystemProperties == systemProperties1); var systemProperties2 = new Dictionary <string, string> { [SystemProperties.LockToken] = lockToken }; var message2 = Mock.Of <IMessage>(m => m.SystemProperties == systemProperties2); // Act await deviceMessageHandler.SendC2DMessageAsync(message1); // Assert underlyingDeviceProxy.Verify(d => d.SendC2DMessageAsync(It.IsAny <IMessage>()), Times.Once); // Act await deviceMessageHandler.SendC2DMessageAsync(message2); // Assert underlyingDeviceProxy.Verify(d => d.SendC2DMessageAsync(It.IsAny <IMessage>()), Times.Once); // Act await deviceMessageHandler.ProcessMessageFeedbackAsync(lockToken, FeedbackStatus.Complete); // Assert cloudProxy.Verify(c => c.SendFeedbackMessageAsync(It.IsAny <string>(), It.IsAny <FeedbackStatus>()), Times.Once); }