我正在尝试编写一组测试,以确认预期的路由是否将到达正确的Controllers / Actions。
我通过查看其他地方的示例来完成其中的一部分,但是现在我不知道如何(或是否有可能)从可用的对象中获取控制器详细信息。
[Test]
public void Test_A_Route()
{
var server = new TestServer(
new WebHostBuilder()
.UseEnvironment("Development")
.UseConfiguration(GetConfiguration())
.UseStartup<Startup>());
var client = server.CreateClient();
var response = client.GetAsync("/My/Url/").GetAwaiter().GetResult();
response.EnsureSuccessStatusCode();
string contentResult = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
contentResult.Should().Contain("Some text from my webpage that is hopefully unique");
}
我希望能够验证以下内容:
有什么想法吗?
答案 0 :(得分:1)
要获取控制器详细信息,建议您使用Flurl。如您在项目文档here及以下所示,您可以按以下方式声明控制器的详细信息。据我了解,该库伪造了HttpClient,并且可以通过单元测试的方式来获取控制器方法的详细信息。我觉得这个项目非常可行,希望对您有帮助。
// fake & record all http calls in the test subject
using (var httpTest = new HttpTest()) {
// arrange
httpTest.RespondWith(200, "OK");
// act
await yourController.CreatePersonAsync();
// assert
httpTest.ShouldHaveCalled("https://api.com/*")
.WithVerb(HttpMethod.Post)
.WithContentType("application/json");
}
答案 1 :(得分:1)
我认为您可以将此IActionFilter用于此任务:
public class DebugFilter : IActionFilter
{
bool enabled = false;
IDictionary<string, object> arguments = null;
public void OnActionExecuting(ActionExecutingContext context)
{
enabled = context.HttpContext.Request.Headers.ContainsKey("X-Debug");
if (enabled)
{
arguments = context.ActionArguments;
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
if (enabled)
{
var controllerName = context.Controller.GetType().Name;
var actionName = context.ActionDescriptor.DisplayName;
context.HttpContext.Response.Headers.Add("X-Controller-Name", controllerName);
context.HttpContext.Response.Headers.Add("X-Action-Name", actionName);
context.HttpContext.Response.Headers.Add("X-Action-Model", JsonConvert.SerializeObject(arguments));
}
}
}
并将其全局注册到您的Startup.cs文件中:
#if DEBUG
services.AddMvc(options =>
{
options.Filters.Add(new DebugFilter());
})
#else
services.AddMvc()
#endif
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
此后,您仅在测试中包括“ X-Debug”标头,并从响应标头接收您想要的所有信息。
编辑:这是一个非常简单的类,您可以访问ViewData,Result,TempData等