Update `TagHelperSampleTest` to avoid failures due to statefulness of the service
- have one test muted at the moment in our CI - add `Reset()` action to the service, enabling `// Arrange` to bring `Index()` content to a known state - add a couple more tests to `TagHelperSampleTest` covering the new action and empty `Index()` list nits: - use `ViewData`, not `ViewBag`
This commit is contained in:
parent
79eb0138c7
commit
7446cec516
|
|
@ -17,11 +17,11 @@ namespace TagHelperSample.Web.Controllers
|
|||
|
||||
public HomeController()
|
||||
{
|
||||
// Unable to set ViewBag (or ViewData) entries from constructor due to an InvalidOperationException thrown
|
||||
// Unable to set ViewBag or ViewData entries from constructor due to an InvalidOperationException thrown
|
||||
// from the DynamicViewData.ViewData getter. In MVC 5.2, no properties in the Controller class except
|
||||
// ControllerContext, Url, and anything ControllerContext-derived (e.g. HttpContext and User) return null
|
||||
// even if invoked from the constructor i.e. prior to the Initialize() call.
|
||||
////ViewBag.Items = _items;
|
||||
////ViewData["Items"] = _items;
|
||||
}
|
||||
|
||||
// GET: /<controller>/
|
||||
|
|
@ -33,7 +33,7 @@ namespace TagHelperSample.Web.Controllers
|
|||
// GET: /Home/Create
|
||||
public IActionResult Create()
|
||||
{
|
||||
ViewBag.Items = _items;
|
||||
ViewData["Items"] = _items;
|
||||
return View();
|
||||
}
|
||||
|
||||
|
|
@ -49,7 +49,7 @@ namespace TagHelperSample.Web.Controllers
|
|||
return RedirectToAction("Index");
|
||||
}
|
||||
|
||||
ViewBag.Items = _items;
|
||||
ViewData["Items"] = _items;
|
||||
return View();
|
||||
}
|
||||
|
||||
|
|
@ -59,7 +59,7 @@ namespace TagHelperSample.Web.Controllers
|
|||
User user;
|
||||
_users.TryGetValue(id, out user);
|
||||
|
||||
ViewBag.Items = _items;
|
||||
ViewData["Items"] = _items;
|
||||
return View(user);
|
||||
}
|
||||
|
||||
|
|
@ -73,8 +73,18 @@ namespace TagHelperSample.Web.Controllers
|
|||
return RedirectToAction("Index");
|
||||
}
|
||||
|
||||
ViewBag.Items = _items;
|
||||
ViewData["Items"] = _items;
|
||||
return View();
|
||||
}
|
||||
|
||||
// POST: Home/Reset
|
||||
[HttpPost]
|
||||
public IActionResult Reset()
|
||||
{
|
||||
_users.Clear();
|
||||
_next = 0;
|
||||
|
||||
return RedirectToAction("Index");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ using System.Net.Http;
|
|||
using System.Net.Http.Headers;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Testing;
|
||||
using Microsoft.AspNetCore.Testing.xunit;
|
||||
using Xunit;
|
||||
|
||||
|
|
@ -29,6 +28,23 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
|
|||
public async Task HomeController_Index_ReturnsExpectedContent()
|
||||
{
|
||||
// Arrange
|
||||
var resetResponse = await Client.PostAsync("http://localhost/Home/Reset", content: null);
|
||||
|
||||
// Guard 1 (start from scratch)
|
||||
AssertRedirectsToHome(resetResponse);
|
||||
|
||||
var createBillyContent = CreateUserFormContent("Billy", "2000-11-28", 0, "hello");
|
||||
var createBillyResponse = await Client.PostAsync("http://localhost/Home/Create", createBillyContent);
|
||||
|
||||
// Guard 2 (ensure user 0 exists)
|
||||
AssertRedirectsToHome(createBillyResponse);
|
||||
|
||||
var createBobbyContent = CreateUserFormContent("Bobby", "1999-10-27", 1, "howdy");
|
||||
var createBobbyResponse = await Client.PostAsync("http://localhost/Home/Create", createBobbyContent);
|
||||
|
||||
// Guard 3 (ensure user 1 exists)
|
||||
AssertRedirectsToHome(createBobbyResponse);
|
||||
|
||||
var expectedMediaType = MediaTypeHeaderValue.Parse("text/html; charset=utf-8");
|
||||
var outputFile = "compiler/resources/TagHelperSample.Web.Home.Index.html";
|
||||
var resourceAssembly = typeof(TagHelperSampleTest).GetTypeInfo().Assembly;
|
||||
|
|
@ -49,6 +65,34 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
|
|||
#endif
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task HomeController_Index_ReturnsExpectedContent_AfterReset()
|
||||
{
|
||||
// Arrange
|
||||
var resetResponse = await Client.PostAsync("http://localhost/Home/Reset", content: null);
|
||||
|
||||
// Guard (start from scratch)
|
||||
AssertRedirectsToHome(resetResponse);
|
||||
|
||||
var expectedMediaType = MediaTypeHeaderValue.Parse("text/html; charset=utf-8");
|
||||
var outputFile = "compiler/resources/TagHelperSample.Web.Home.Index-Reset.html";
|
||||
var resourceAssembly = typeof(TagHelperSampleTest).GetTypeInfo().Assembly;
|
||||
var expectedContent = await ResourceFile.ReadResourceAsync(resourceAssembly, outputFile, sourceFile: false);
|
||||
|
||||
// Act
|
||||
var response = await Client.GetAsync("http://localhost/");
|
||||
var responseContent = await response.Content.ReadAsStringAsync();
|
||||
|
||||
// Assert
|
||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||
Assert.Equal(expectedMediaType, response.Content.Headers.ContentType);
|
||||
|
||||
#if GENERATE_BASELINES
|
||||
ResourceFile.UpdateFile(resourceAssembly, outputFile, expectedContent, responseContent);
|
||||
#else
|
||||
Assert.Equal(expectedContent, responseContent, ignoreLineEndingDifferences: true);
|
||||
#endif
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task HomeController_Create_Get_ReturnsSuccess()
|
||||
|
|
@ -80,7 +124,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
|
|||
var createBillyContent = CreateUserFormContent("Billy", "2000-11-30", 0, "hello");
|
||||
var createBilly = await Client.PostAsync("http://localhost/Home/Create", createBillyContent);
|
||||
|
||||
// Guard
|
||||
// Guard (ensure user 0 exists)
|
||||
AssertRedirectsToHome(createBilly);
|
||||
|
||||
// Act
|
||||
|
|
@ -95,12 +139,13 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
|
|||
{
|
||||
// Arrange
|
||||
var createBillyContent = CreateUserFormContent("Billy", "2000-11-30", 0, "hello");
|
||||
var changeBillyContent = CreateUserFormContent("Bobby", "1999-11-30", 1, "howdy");
|
||||
var createBilly = await Client.PostAsync("http://localhost/Home/Create", createBillyContent);
|
||||
|
||||
// Guard
|
||||
// Guard (ensure user 0 exists)
|
||||
AssertRedirectsToHome(createBilly);
|
||||
|
||||
var changeBillyContent = CreateUserFormContent("Bobby", "1999-11-30", 1, "howdy");
|
||||
|
||||
// Act
|
||||
var changeBilly = await Client.PostAsync("http://localhost/Home/Edit/0", changeBillyContent);
|
||||
|
||||
|
|
@ -108,6 +153,16 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
|
|||
AssertRedirectsToHome(changeBilly);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task HomeController_Reset_ReturnsSuccess()
|
||||
{
|
||||
// Arrange and Act
|
||||
var response = await Client.PostAsync("http://localhost/Home/Reset", content: null);
|
||||
|
||||
// Assert
|
||||
AssertRedirectsToHome(response);
|
||||
}
|
||||
|
||||
public static TheoryData MoviesControllerPageData
|
||||
{
|
||||
get
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link href="/css/sub/blank.css" rel="stylesheet" data-test="value" />
|
||||
<link href="site.min.css" rel="stylesheet" data-test="value" />
|
||||
<meta name="x-stylesheet-fallback-test" content="" class="fallback-test" /><script>!function(a,b,c){var d,e=document,f=e.getElementsByTagName("SCRIPT"),g=f[f.length-1].previousElementSibling,h=e.defaultView&&e.defaultView.getComputedStyle?e.defaultView.getComputedStyle(g):g.currentStyle;if(h&&h[a]!==b)for(d=0;d<c.length;d++)e.write('<link rel="stylesheet" href="'+c[d]+'"/>')}("visibility","hidden",["\/site.css"]);</script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
|
||||
<script src="/originalXX.js">
|
||||
// 1. By removing the src attribute, the script below will execute and prevent fallback from running
|
||||
// 2. Alternatively fix the type in the value of the src attribute
|
||||
function foo() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
function bar() {
|
||||
document.write("<p>foo is from page</p>");
|
||||
}
|
||||
</script>
|
||||
<script>(window.foo||document.write("<script src=\"\/fallback.js\"><\/script>"));</script>
|
||||
|
||||
<script>bar();</script>
|
||||
|
||||
<h2>Index</h2>
|
||||
<p>
|
||||
<a href="/Home/Create">Create New</a>
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -33,7 +33,7 @@
|
|||
</div>
|
||||
<div class="form-group">
|
||||
<label for="z0__DateOfBirth">DateOfBirth</label>
|
||||
<input type="date" disabled="disabled" readonly="readonly" data-val="true" data-val-required="The DateOfBirth field is required." id="z0__DateOfBirth" name="[0].DateOfBirth" value="2000-11-30" />
|
||||
<input type="date" disabled="disabled" readonly="readonly" data-val="true" data-val-required="The DateOfBirth field is required." id="z0__DateOfBirth" name="[0].DateOfBirth" value="2000-11-28" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="z0__YearsEmployeed">YearsEmployeed</label>
|
||||
|
|
@ -49,20 +49,20 @@ hello</textarea>
|
|||
</p>
|
||||
<div class="form-group">
|
||||
<label for="z1__Name">Name</label>
|
||||
<input type="text" disabled="disabled" readonly="readonly" id="z1__Name" name="[1].Name" value="Billy" />
|
||||
<input type="text" disabled="disabled" readonly="readonly" id="z1__Name" name="[1].Name" value="Bobby" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="z1__DateOfBirth">DateOfBirth</label>
|
||||
<input type="date" disabled="disabled" readonly="readonly" data-val="true" data-val-required="The DateOfBirth field is required." id="z1__DateOfBirth" name="[1].DateOfBirth" value="2000-11-30" />
|
||||
<input type="date" disabled="disabled" readonly="readonly" data-val="true" data-val-required="The DateOfBirth field is required." id="z1__DateOfBirth" name="[1].DateOfBirth" value="1999-10-27" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="z1__YearsEmployeed">YearsEmployeed</label>
|
||||
<input type="number" disabled="disabled" readonly="readonly" data-val="true" data-val-required="The YearsEmployeed field is required." id="z1__YearsEmployeed" name="[1].YearsEmployeed" value="0" />
|
||||
<input type="number" disabled="disabled" readonly="readonly" data-val="true" data-val-required="The YearsEmployeed field is required." id="z1__YearsEmployeed" name="[1].YearsEmployeed" value="1" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="z1__Blurb">Blurb</label>
|
||||
<textarea rows="4" disabled="disabled" readonly="readonly" id="z1__Blurb" name="[1].Blurb">
|
||||
hello</textarea>
|
||||
howdy</textarea>
|
||||
</div>
|
||||
<p>
|
||||
<a href="/Home/Edit/1">Edit</a>
|
||||
|
|
|
|||
Loading…
Reference in New Issue