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();
}
我开始使用Moq并挣扎了一下。 我想验证messageServiceClient正在接收正确的参数,这是一个XmlElement,但我找不到任何方法使其工作。它只有在我没有检查特定值时才有效。使用Moq验证特定参数
任何想法?
部分回答: 我发现了一种方法来测试发送到代理的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());
}
顺便说一句,我怎么能从验证呼叫中提取表达式?
谢谢,这对我来说很有意义。 我仍然无法理解的是何时在安装或验证中指定详细信息。这很混乱。目前,我只允许安装程序中的任何内容并在验证中指定值。 – 2011-02-10 15:10:28
您认为我有多次通话时可以查看留言吗? 客户端接收消息,并可以创建多个队列消息,这将最终在多个调用中,并在每个这些调用中,我必须检查不同的消息。 我仍然在单元测试中苦苦挣扎,我对它还不是很熟悉。 – 2011-02-10 15:21:35
我不认为你应该如何做到这一点,有一个神奇的银弹。这需要练习,你开始变得更好。对于我来说,只有当我有一些东西可以与另一个测试中的参数进行比较时才指定参数。至于多次呼叫,有几种方法。为了设置和验证多次调用的函数,我通常为每个我期望的调用调用setup或verify(Times.Once()) - 通常使用for循环。您可以使用特定参数来隔离每个呼叫。 – Mayo 2011-02-10 16:38:24