Исследовали ли вы библиотеки, такие как CherryPy ? Они обеспечивают гораздо более быстрый путь к обработке этих вещей, чем BaseHTTPServer.
Здесь я приведу пример тестового блока с вспомогательной функцией.
Контрольный пример: - вспомогательная функция Request_With_Query: - HttpReuqestSetup (путем mokcing HttprequestObject)
Я заметил, что издевался над объектом регистратора, так как он может помочь мне с предоставлением полезной информации
функция выглядит как
public static class HttpTrigger
{
[FunctionName("HttpTrigger")]
public async static Task<IActionResult> RunAsync([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
string requestBody = new StreamReader(req.Body).ReadToEnd();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
}
и вот так выглядит мой тестовый класс:
[TestClass]
public class HttpTriggerTest : FunctionTestHelper.FunctionTest
{
[TestMethod]
public async Task Request_With_Query()
{
var query = new Dictionary<String, StringValues>();
query.TryAdd("name", "ushio");
var body = "";
var result = await HttpTrigger.RunAsync(req: HttpRequestSetup(query, body), log: log);
var resultObject = (OkObjectResult)result;
Assert.AreEqual("Hello, ushio", resultObject.Value);
}
[TestMethod]
public async Task Request_Without_Query()
{
var query = new Dictionary<String, StringValues>();
var body = "{\"name\":\"yamada\"}";
var result = await HttpTrigger.RunAsync(HttpRequestSetup(query, body), log);
var resultObject = (OkObjectResult)result;
Assert.AreEqual("Hello, yamada", resultObject.Value);
}
[TestMethod]
public async Task Request_Without_Query_And_Body()
{
var query = new Dictionary<String, StringValues>();
var body = "";
var result = await HttpTrigger.RunAsync(HttpRequestSetup(query, body), log);
var resultObject = (BadRequestObjectResult)result;
Assert.AreEqual("Please pass a name on the query string or in the request body", resultObject.Value);
}
}
Вот классы Helper
с использованием Microsoft.AspNetCore.Http; использование Microsoft.AspNetCore.Http.Internal; использование Microsoft.Azure.WebJobs; использование Microsoft.Azure.WebJobs.Host; использование Microsoft.Extensions.Primitives; используя Moq; используя Систему; using System.Collections.Generic; используя System.IO; используя System.Net.Http; используя System.Text; используя System.Threading; используя System.Threading.Tasks;
namespace FunctionTestHelper
{
public abstract class FunctionTest
{
protected TraceWriter log = new VerboseDiagnosticsTraceWriter();
public HttpRequest HttpRequestSetup(Dictionary<String, StringValues> query, string body)
{
var reqMock = new Mock<HttpRequest>();
reqMock.Setup(req => req.Query).Returns(new QueryCollection(query));
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(body);
writer.Flush();
stream.Position = 0;
reqMock.Setup(req => req.Body).Returns(stream);
return reqMock.Object;
}
}
public class AsyncCollector<T> : IAsyncCollector<T>
{
public readonly List<T> Items = new List<T>();
public Task AddAsync(T item, CancellationToken cancellationToken = default(CancellationToken))
{
Items.Add(item);
return Task.FromResult(true);
}
public Task FlushAsync(CancellationToken cancellationToken = default(CancellationToken))
{
return Task.FromResult(true);
}
}
}
public class VerboseDiagnosticsTraceWriter : TraceWriter
{
public VerboseDiagnosticsTraceWriter() : base(TraceLevel.Verbose)
{
}
public override void Trace(TraceEvent traceEvent)
{
Debug.WriteLine(traceEvent.Message);
}
}
Используйте подобный шаблон в вашем случае, вы должны быть в состоянии издеваться и писать UT мирно.
Надеюсь, это поможет.