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