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:
Doug Bunting 2016-01-26 09:54:23 -08:00
parent 79eb0138c7
commit 7446cec516
4 changed files with 114 additions and 15 deletions

View File

@ -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");
}
}
}

View File

@ -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

View File

@ -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>

View File

@ -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>