public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully() { var messageServiceClientMock = new Mock<IMessageServiceClient>(); var queueableMessage = CreateSingleQueueableMessage(); var message = queueableMessage[0]; var xml = QueueableMessageAsXml(queueableMessage); messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(xml)).Verifiable(); //messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable(); var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>(); serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(essageServiceClientMock.Object); var loggerStub = new Mock<ILogger>(); var client = new MessageClient(serviceProxyFactoryStub.Object, loggerStub.Object); client.SubmitMessagesToQueue(new List<IMessageRequestDTO> {message}); //messageServiceClientMock.Verify(proxy => proxy.SubmitMessage(xml), Times.Once()); messageServiceClientMock.Verify(); }
我开始使用起订量并有点挣扎。我正在尝试验证 messageServiceClient 是否接收到正确的参数,即 XmlElement,但我找不到任何使其工作的方法。它仅在我不检查特定值时才有效。
有任何想法吗?
部分答案:我找到了一种方法来测试发送到代理的 xml 是否正确,但我仍然认为这不是正确的方法。
public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully() { var messageServiceClientMock = new Mock<IMessageServiceClient>(); messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable(); var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>(); serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(messageServiceClientMock.Object); var loggerStub = new Mock<ILogger>(); var client = new MessageClient(serviceProxyFactoryStub.Object, loggerStub.Object); var message = CreateMessage(); client.SubmitMessagesToQueue(new List<IMessageRequestDTO> {message}); messageServiceClientMock.Verify(proxy => proxy.SubmitMessage(It.Is<XmlElement>(xmlElement => XMLDeserializer<QueueableMessage>.Deserialize(xmlElement).Messages.Contains(message))), Times.Once()); }
顺便说一句,我如何从验证调用中提取表达式?
如果验证逻辑很重要,那么编写一个大的 lambda 方法会很麻烦(如您的示例所示)。您可以将所有测试语句放在一个单独的方法中,但我不喜欢这样做,因为它会破坏读取测试代码的流程。
另一种选择是在 Setup 调用中使用回调来存储传递给模拟方法的值,然后编写标准Assert方法来验证它。例如:
Assert
// Arrange MyObject saveObject; mock.Setup(c => c.Method(It.IsAny<int>(), It.IsAny<MyObject>())) .Callback<int, MyObject>((i, obj) => saveObject = obj) .Returns("xyzzy"); // Act // ... // Assert // Verify Method was called once only mock.Verify(c => c.Method(It.IsAny<int>(), It.IsAny<MyObject>()), Times.Once()); // Assert about saveObject Assert.That(saveObject.TheProperty, Is.EqualTo(2));