using System.Threading.Tasks;
public static void Main()
var firstTestCase = await HttpTestCaseBuilder
.TestCase("Create user with invalid password")
.Arrange(req => req.HttpMethod = HttpMethod.Post)
.Arrange(req => req.Headers.Authorization = "...")
.Arrange(req => req.Content = Json.Load(...))
.Assert(resBody => Assert.NonEmpty(resBody.infos[name=LogToken]));
public interface IBuilder<T>
public interface ITestCaseContext
Task ThenAsync(Func<Task> fn);
public static class ITestCaseContextExtensions
public static async Task<T> ChainArrangeAsync<T>(this T testCaseContext)
where T : ITestCaseContext
await testCaseContext.ArrangeAsync();
public interface IHttpClientTestCaseContext<T> : ITestCaseContext<T>
public class HttpClientTestCaseContext : IHttpClientTestCaseContext<HttpClientTestCaseContext>
public virtual HttpClientTestCaseContext Arrange()
public virtual HttpClientTestCaseContext Act()
public virtual HttpClientTestCaseContext Assert()
public virtual HttpClientTestCaseContext Then(Func<HttpClientTestCaseContext> fn)