Adding some basic functional tests
I ran into a blocking issue where page handlers aren't picked up, so I fixed it. Logging another issue to follow up with better tests for this.
This commit is contained in:
parent
36e4dbe941
commit
19331f9532
|
|
@ -167,7 +167,14 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
{
|
{
|
||||||
var actionDescriptor = (PageActionDescriptor)context.ActionContext.ActionDescriptor;
|
var actionDescriptor = (PageActionDescriptor)context.ActionContext.ActionDescriptor;
|
||||||
var compiledType = _loader.Load(actionDescriptor).GetTypeInfo();
|
var compiledType = _loader.Load(actionDescriptor).GetTypeInfo();
|
||||||
|
|
||||||
|
// If a model type wasn't set in code then the model property's type will be the same
|
||||||
|
// as the compiled type.
|
||||||
var modelType = compiledType.GetProperty(ModelPropertyName)?.PropertyType.GetTypeInfo();
|
var modelType = compiledType.GetProperty(ModelPropertyName)?.PropertyType.GetTypeInfo();
|
||||||
|
if (modelType == compiledType)
|
||||||
|
{
|
||||||
|
modelType = null;
|
||||||
|
}
|
||||||
|
|
||||||
var compiledActionDescriptor = new CompiledPageActionDescriptor(actionDescriptor)
|
var compiledActionDescriptor = new CompiledPageActionDescriptor(actionDescriptor)
|
||||||
{
|
{
|
||||||
|
|
@ -180,16 +187,16 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
|
|
||||||
Func<PageContext, object> modelFactory = null;
|
Func<PageContext, object> modelFactory = null;
|
||||||
Action<PageContext, object> modelReleaser = null;
|
Action<PageContext, object> modelReleaser = null;
|
||||||
if (modelType != null)
|
if (modelType == null)
|
||||||
{
|
{
|
||||||
|
PopulateHandlerMethodDescriptors(compiledType, compiledActionDescriptor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PopulateHandlerMethodDescriptors(modelType, compiledActionDescriptor);
|
||||||
|
|
||||||
modelFactory = _modelFactoryProvider.CreateModelFactory(compiledActionDescriptor);
|
modelFactory = _modelFactoryProvider.CreateModelFactory(compiledActionDescriptor);
|
||||||
modelReleaser = _modelFactoryProvider.CreateModelDisposer(compiledActionDescriptor);
|
modelReleaser = _modelFactoryProvider.CreateModelDisposer(compiledActionDescriptor);
|
||||||
|
|
||||||
if (modelType != compiledType)
|
|
||||||
{
|
|
||||||
// If the model and page type are different discover handler methods on the model as well.
|
|
||||||
PopulateHandlerMethodDescriptors(modelType, compiledActionDescriptor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var pageStartFactories = GetPageStartFactories(compiledActionDescriptor);
|
var pageStartFactories = GetPageStartFactories(compiledActionDescriptor);
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,11 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
{
|
{
|
||||||
var pageContext = (PageContext)context;
|
var pageContext = (PageContext)context;
|
||||||
var vddType = typeof(ViewDataDictionary<>);
|
var vddType = typeof(ViewDataDictionary<>);
|
||||||
vddType = vddType.MakeGenericType(pageContext.ActionDescriptor.ModelTypeInfo.AsType());
|
|
||||||
|
var modelTypeInfo = pageContext.ActionDescriptor.ModelTypeInfo ?? pageContext.ActionDescriptor.PageTypeInfo;
|
||||||
|
|
||||||
|
|
||||||
|
vddType = vddType.MakeGenericType(modelTypeInfo.AsType());
|
||||||
|
|
||||||
context.ViewData = (ViewDataDictionary)Activator.CreateInstance(vddType, context.ViewData);
|
context.ViewData = (ViewDataDictionary)Activator.CreateInstance(vddType, context.ViewData);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,84 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Mvc.FunctionalTests
|
||||||
|
{
|
||||||
|
public class RazorPagesTest : IClassFixture<MvcTestFixture<RazorPagesWebSite.Startup>>
|
||||||
|
{
|
||||||
|
public RazorPagesTest(MvcTestFixture<RazorPagesWebSite.Startup> fixture)
|
||||||
|
{
|
||||||
|
Client = fixture.Client;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpClient Client { get; }
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task HelloWorld_CanGetContent()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/HelloWorld");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var response = await Client.SendAsync(request);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
|
|
||||||
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
Assert.Equal("Hello, World!", content.Trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task HelloWorldWithRoute_CanGetContent()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/HelloWorldWithRoute/Some/Path/route");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var response = await Client.SendAsync(request);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
|
|
||||||
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
Assert.Equal("Hello, route!", content.Trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task HelloWorldWithHandler_CanGetContent()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/HelloWorldWithHandler?message=handler");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var response = await Client.SendAsync(request);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
|
|
||||||
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
Assert.Equal("Hello, handler!", content.Trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task HelloWorldWithPageModelHandler_CanGetContent()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/HelloWorldWithPageModelHandler?message=pagemodel");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var response = await Client.SendAsync(request);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
|
|
||||||
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
Assert.Equal("Hello, pagemodel!", content.Trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
@page
|
||||||
|
|
||||||
|
Hello, World!
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
@page
|
||||||
|
|
||||||
|
@functions {
|
||||||
|
public string Message { get; set; }
|
||||||
|
|
||||||
|
public void OnGet(string message)
|
||||||
|
{
|
||||||
|
Message = message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Hello, @Message!
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||||
|
|
||||||
|
namespace RazorPagesWebSite
|
||||||
|
{
|
||||||
|
public class HelloWorldWithPageModelHandler : PageModel
|
||||||
|
{
|
||||||
|
public string Message { get; set; }
|
||||||
|
|
||||||
|
public void OnGet(string message)
|
||||||
|
{
|
||||||
|
Message = message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
@page
|
||||||
|
@model RazorPagesWebSite.HelloWorldWithPageModelHandler
|
||||||
|
|
||||||
|
Hello, @Model.Message!
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
@page Some/Path/{text}
|
||||||
|
|
||||||
|
Hello, @(ViewContext.RouteData.Values["text"])!
|
||||||
Loading…
Reference in New Issue