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();
}
Saya mulai menggunakan Moq dan sedikit berjuang. Saya mencoba memverifikasi bahwa messageServiceClient menerima parameter yang tepat, yang merupakan XmlElement, tetapi saya tidak dapat menemukan cara untuk membuatnya berfungsi. Ini hanya berfungsi ketika saya tidak memeriksa nilai tertentu.
Ada ide?
Sebagian jawaban: Saya telah menemukan cara untuk menguji bahwa xml yang dikirim ke proxy sudah benar, tetapi saya masih berpikir itu bukan cara yang tepat untuk melakukannya.
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());
}
Ngomong-ngomong, bagaimana saya bisa mengekstrak ekspresi dari panggilan Verifikasi?
sumber
Saya telah memverifikasi panggilan dengan cara yang sama - saya percaya ini adalah cara yang tepat untuk melakukannya.
Jika ekspresi lambda Anda menjadi berat, Anda dapat membuat fungsi yang mengambil
MyObject
input dan outputtrue
/false
...Perlu diketahui juga bug dengan Mock di mana pesan kesalahan menyatakan bahwa metode dipanggil beberapa kali ketika tidak dipanggil sama sekali. Mereka mungkin telah memperbaikinya sekarang - tetapi jika Anda melihat pesan itu, Anda dapat mempertimbangkan memverifikasi bahwa metode itu sebenarnya dipanggil.
EDIT: Berikut adalah contoh panggilan verifikasi beberapa kali untuk skenario di mana Anda ingin memverifikasi bahwa Anda memanggil fungsi untuk setiap objek dalam daftar (misalnya).
Pendekatan yang sama untuk pengaturan ...
Jadi setiap kali GetStuff dipanggil untuk itemId itu, itu akan mengembalikan barang-barang khusus untuk item itu. Atau, Anda bisa menggunakan fungsi yang mengambil itemId sebagai input dan mengembalikan barang.
Satu metode lain yang saya lihat di sebuah blog beberapa waktu lalu (Phil Haack mungkin?) Memiliki pengaturan kembali dari beberapa jenis objek dequeue - setiap kali fungsi dipanggil akan menarik item dari antrian.
sumber
Cara yang lebih sederhana adalah dengan melakukan:
sumber
m.Setup(x => x.CreateSR(Code.WRDD)).ReturnsAsync(0); await ClassUnderTest.CompleteCC(accountKey, It.IsAny<int>(), mockRequest); m.Verify(x => x.CreateSR(It.Is<Code>(p => p == Code.WRCC)), Times.Once());
Saya percaya bahwa masalah dalam kenyataan bahwa Moq akan memeriksa kesetaraan. Dan, karena XmlElement tidak mengesampingkan Persamaan, implementasinya akan memeriksa kesetaraan referensi.
Tidak bisakah Anda menggunakan objek khusus, sehingga Anda dapat menimpa sama dengan?
sumber
Punya salah satu dari ini juga, tetapi parameter tindakan adalah antarmuka tanpa properti publik. Akhirnya menggunakan It.Is () dengan metode terpisah dan dalam metode ini harus melakukan beberapa mengejek antarmuka
sumber