मैं एक सेवा के लिए एक विधि का परीक्षण कर रहा हूं जो वेब API
कॉल करती है। HttpClient
यदि मैं वेब सेवा (समाधान में किसी अन्य परियोजना में स्थित) को स्थानीय रूप से चलाता हूं, तो यूनिट परीक्षणों के लिए सामान्य कार्यों का उपयोग करना ठीक है।
हालाँकि जब मैं अपने परिवर्तनों की जाँच करता हूँ तो बिल्ड सर्वर की वेब सेवा तक पहुँच नहीं होगी इसलिए परीक्षण विफल हो जाएंगे।
मैंने अपने यूनिट परीक्षणों के लिए एक IHttpClient
इंटरफ़ेस बनाकर और एक संस्करण को लागू करने के लिए इसके चारों ओर एक रास्ता तैयार किया है, जिसे मैं अपने आवेदन में उपयोग करता हूं। यूनिट परीक्षणों के लिए, मैं एक नकली असिंक्रोनस पोस्ट विधि के साथ एक नकली संस्करण को पूरा करता हूं। यहां मैं समस्याओं में चला गया हूं। मैं HttpStatusResult
इस विशेष परीक्षा के लिए ओके लौटना चाहता हूं । एक और समान परीक्षण के लिए मैं एक बुरा परिणाम लौटाऊंगा।
परीक्षा चलेगी लेकिन कभी पूरी नहीं होगी। यह प्रतीक्षा में लटका रहता है। मैं अतुल्यकालिक प्रोग्रामिंग, डेलीगेट्स और खुद Moq में नया हूँ और नई चीजों को सीखने के लिए कुछ समय के लिए SO और google को खोज रहा हूं, लेकिन मैं अभी भी इस समस्या को हल नहीं कर सकता।
यहाँ वह विधि है जिसे मैं परखने की कोशिश कर रहा हूँ:
public async Task<bool> QueueNotificationAsync(IHttpClient client, Email email)
{
// do stuff
try
{
// The test hangs here, never returning
HttpResponseMessage response = await client.PostAsync(uri, content);
// more logic here
}
// more stuff
}
यहाँ मेरी इकाई परीक्षण विधि है:
[TestMethod]
public async Task QueueNotificationAsync_Completes_With_ValidEmail()
{
Email email = new Email()
{
FromAddress = "bob@example.com",
ToAddress = "bill@example.com",
CCAddress = "brian@example.com",
BCCAddress = "ben@example.com",
Subject = "Hello",
Body = "Hello World."
};
var mockClient = new Mock<IHttpClient>();
mockClient.Setup(c => c.PostAsync(
It.IsAny<Uri>(),
It.IsAny<HttpContent>()
)).Returns(() => new Task<HttpResponseMessage>(() => new HttpResponseMessage(System.Net.HttpStatusCode.OK)));
bool result = await _notificationRequestService.QueueNotificationAsync(mockClient.Object, email);
Assert.IsTrue(result, "Queue failed.");
}
मैं क्या गलत कर रहा हूं?
आपके सहयोग के लिए धन्यवाद।