আমি অনেক উত্তর দ্বারা বিশ্বাসী না।
প্রথমত, কল্পনা করুন যে আপনি কোনও পদ্ধতিটি ব্যবহার করছেন তা পরীক্ষা করতে চান HttpClient
। HttpClient
আপনার বাস্তবায়নে সরাসরি তাত্পর্যপূর্ণ করা উচিত নয় । আপনার জন্য একটি উদাহরণ সরবরাহ করার দায়িত্ব নিয়ে কারখানাটি ইনজেক করা উচিত HttpClient
। এইভাবে আপনি পরে সেই কারখানায় বিদ্রূপ করতে পারেন এবং যে কোনওটি ফিরে আসতে HttpClient
পারেন (যেমন: একটি উপহাস HttpClient
এবং আসলটি নয়)।
সুতরাং, আপনার নীচের মত একটি কারখানা হবে:
public interface IHttpClientFactory
{
HttpClient Create();
}
এবং একটি বাস্তবায়ন:
public class HttpClientFactory
: IHttpClientFactory
{
public HttpClient Create()
{
var httpClient = new HttpClient();
return httpClient;
}
}
অবশ্যই এই বাস্তবায়নটি আপনার আইওসি কনটেইনারটিতে নিবন্ধন করতে হবে। আপনি যদি অটোফ্যাক ব্যবহার করেন তবে এটি এমন কিছু হবে:
builder
.RegisterType<IHttpClientFactory>()
.As<HttpClientFactory>()
.SingleInstance();
এখন আপনার একটি যথাযথ এবং পরীক্ষামূলক বাস্তবায়ন হবে। ভাবুন যে আপনার পদ্ধতিটি এমন কিছু:
public class MyHttpClient
: IMyHttpClient
{
private readonly IHttpClientFactory _httpClientFactory;
public SalesOrderHttpClient(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public async Task<string> PostAsync(Uri uri, string content)
{
using (var client = _httpClientFactory.Create())
{
var clientAddress = uri.GetLeftPart(UriPartial.Authority);
client.BaseAddress = new Uri(clientAddress);
var content = new StringContent(content, Encoding.UTF8, "application/json");
var uriAbsolutePath = uri.AbsolutePath;
var response = await client.PostAsync(uriAbsolutePath, content);
var responseJson = response.Content.ReadAsStringAsync().Result;
return responseJson;
}
}
}
এখন পরীক্ষার অংশ। HttpClient
প্রসারিত HttpMessageHandler
, যা বিমূর্ত। আসুন এর একটি "মক" তৈরি করুন HttpMessageHandler
যা একটি প্রতিনিধিকে গ্রহণ করে যাতে আমরা মকটি ব্যবহার করার সময় প্রতিটি পরীক্ষার জন্য প্রতিটি আচরণও সেটআপ করতে পারি।
public class MockHttpMessageHandler
: HttpMessageHandler
{
private readonly Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> _sendAsyncFunc;
public MockHttpMessageHandler(Func<HttpRequestMessage, CancellationToken, Task<HttpResponseMessage>> sendAsyncFunc)
{
_sendAsyncFunc = sendAsyncFunc;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return await _sendAsyncFunc.Invoke(request, cancellationToken);
}
}
এবং এখন এবং মোকের সহায়তায় (এবং ফ্লুয়েটসেসারেশন, একটি গ্রন্থাগার যা ইউনিটকে আরও পাঠযোগ্য করে তোলে) HttpClient
public static class PostAsyncTests
{
public class Given_A_Uri_And_A_JsonMessage_When_Posting_Async
: Given_WhenAsync_Then_Test
{
private SalesOrderHttpClient _sut;
private Uri _uri;
private string _content;
private string _expectedResult;
private string _result;
protected override void Given()
{
_uri = new Uri("http://test.com/api/resources");
_content = "{\"foo\": \"bar\"}";
_expectedResult = "{\"result\": \"ok\"}";
var httpClientFactoryMock = new Mock<IHttpClientFactory>();
var messageHandlerMock =
new MockHttpMessageHandler((request, cancellation) =>
{
var responseMessage =
new HttpResponseMessage(HttpStatusCode.Created)
{
Content = new StringContent("{\"result\": \"ok\"}")
};
var result = Task.FromResult(responseMessage);
return result;
});
var httpClient = new HttpClient(messageHandlerMock);
httpClientFactoryMock
.Setup(x => x.Create())
.Returns(httpClient);
var httpClientFactory = httpClientFactoryMock.Object;
_sut = new SalesOrderHttpClient(httpClientFactory);
}
protected override async Task WhenAsync()
{
_result = await _sut.PostAsync(_uri, _content);
}
[Fact]
public void Then_It_Should_Return_A_Valid_JsonMessage()
{
_result.Should().BeEquivalentTo(_expectedResult);
}
}
}
স্পষ্টতই এই পরীক্ষাটি নির্বোধ, এবং আমরা সত্যিই আমাদের উপহাস পরীক্ষা করছি। তবে আপনি ধারণা পেতে পারেন। আপনার প্রয়োগের উপর নির্ভর করে আপনার অর্থপূর্ণ যুক্তি পরীক্ষা করা উচিত যেমন ..
- যদি প্রতিক্রিয়ার কোড স্থিতিটি 201 না হয় তবে এটি কি একটি ব্যতিক্রম ছুঁড়ে ফেলা উচিত?
- প্রতিক্রিয়া পাঠ্য যদি বিশ্লেষণ করা যায় না, তবে কী হবে?
- প্রভৃতি
এই উত্তরের উদ্দেশ্যটি হ'ল এইচটিপিপ্লিনেন্ট ব্যবহার করে এমন কিছু পরীক্ষা করা এবং এটি করার জন্য এটি একটি দুর্দান্ত পরিষ্কার উপায় clean
HttpClient
আপনার ইন্টারফেসে এক্সপোজ করা সমস্যাটি যেখানে। আপনি আপনার ক্লায়েন্টকেHttpClient
কংক্রিটের ক্লাস ব্যবহার করতে বাধ্য করছেন are পরিবর্তে, আপনি একটি এক্সপোজ করা উচিত বিমূর্ততা এরHttpClient
।