Last active
February 14, 2016 18:54
-
-
Save chrisfcarroll/11b21870c0d50a4b9ef1 to your computer and use it in GitHub Desktop.
An Asp.Net MVC PartialView for in-browser page testing. Makes it possible to test complex UIs and widgets 'in situ' but with zero client-side pageweight in production.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@model IEnumerable<string> | |
@if (Request.IsLocal | |
&& ( Request.QueryString["test"]!=null | |
|| | |
Request.QueryString.ToString().Split('&').Any(k=>k.Equals("test",StringComparison.InvariantCultureIgnoreCase)) | |
)) | |
{ | |
<div id="unit-tests"> | |
<script src='~/scripts/qunit-1.20.0.js'></script> | |
<script src='~/scripts/qunit-parameterize.js'></script> | |
<div> | |
<h1 id="qunit-header">Run All QUnit Tests</h1> | |
<h2 id="qunit-banner"></h2> | |
<div id="qunit-testrunner-toolbar"></div> | |
<h2 id="qunit-userAgent"></h2> | |
<ol id="qunit-tests"></ol> | |
<div id="qunit-fixture">test markup, will be hidden</div> | |
</div> | |
@foreach (var testHelpers in new []{"~/scripts/tests/test-helpers.js"}) | |
{ | |
<script src="@Url.Content(testHelpers)"></script> | |
} | |
@foreach (var testScriptPath in Model??new string[0]) | |
{ | |
<script src="@Url.Content(testScriptPath)"></script> | |
} | |
<script>QUnit.done(function () { $('html, body').animate({ scrollTop: $("#unit-tests").offset().top-30 }, { easing: 'swing' }); })</script> | |
<style scoped>div#unit-tests {margin: 30px 0;clear: both;display: block;}</style> | |
<style scoped> | |
/* cut-n-paste from qunit.css but some changes to combat page styles affecting test layout*/ | |
/*! | |
* QUnit 1.20.0 | |
* http://qunitjs.com/ | |
* | |
* Copyright jQuery Foundation and other contributors | |
* Released under the MIT license | |
* http://jquery.org/license | |
* | |
* Date: 2015-10-27T17:53Z | |
*/ | |
/** Font Family and Sizes */ | |
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult { | |
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif !important; | |
} | |
#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small !important} | |
#qunit-tests { font-size: smaller !important; } | |
/** Resets */ | |
#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { | |
margin: 0; | |
padding: 0; | |
} | |
/** Header */ | |
#qunit-header { | |
padding: 0.5em 0 0.5em 1em; | |
color: #8699A4; | |
background-color: #0D3349; | |
font-size: 1.5em; | |
line-height: 1em; | |
font-weight: 400; | |
border-radius: 5px 5px 0 0; | |
} | |
#qunit-header a { | |
text-decoration: none; | |
color: #C2CCD1; | |
} | |
#qunit-header a:hover, | |
#qunit-header a:focus { | |
color: #FFF; | |
} | |
#qunit-testrunner-toolbar label { | |
display: inline-block; | |
padding: 0 0.5em 0 0.1em; | |
} | |
#qunit-banner { | |
height: 0.7em; | |
} | |
#qunit-testrunner-toolbar { | |
padding: 0.5em 1em 0.5em 1em; | |
color: #5E740B; | |
background-color: #EEE; | |
overflow: hidden; | |
} | |
#qunit-filteredTest { | |
padding: 0.5em 1em 0.5em 1em; | |
background-color: #F4FF77; | |
color: #366097; | |
} | |
#qunit-userAgent { | |
padding: 0.5em 1em 0.5em 1em; | |
background-color: #2B81AF; | |
color: #FFF; | |
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; | |
} | |
#qunit-modulefilter-container { | |
float: right; | |
padding: 0.2em; | |
} | |
.qunit-url-config { | |
display: inline-block; | |
padding: 0.1em; | |
} | |
.qunit-filter { | |
display: block; | |
float: right; | |
margin-left: 1em; | |
} | |
/** Tests: Pass/Fail */ | |
#qunit-tests { | |
list-style-position: inside; | |
} | |
#qunit-tests li { | |
padding: 0.4em 1em 0.4em 1em; | |
border-bottom: 1px solid #FFF; | |
list-style-position: inside; | |
} | |
#qunit-tests > li { | |
display: none; | |
} | |
#qunit-tests li.running, | |
#qunit-tests li.pass, | |
#qunit-tests li.fail, | |
#qunit-tests li.skipped { | |
display: list-item; | |
} | |
#qunit-tests.hidepass li.running, | |
#qunit-tests.hidepass li.pass { | |
visibility: hidden; | |
position: absolute; | |
width: 0; | |
height: 0; | |
padding: 0; | |
border: 0; | |
margin: 0; | |
} | |
#qunit-tests li strong { | |
cursor: pointer; | |
font-size: inherit; | |
font-weight: inherit; | |
line-height: inherit; | |
display: initial; | |
} | |
#qunit-tests li.skipped strong { | |
cursor: default; | |
} | |
#qunit-tests li a { | |
padding: 0.5em; | |
color: #C2CCD1; | |
text-decoration: none; | |
} | |
#qunit-tests li p a { | |
padding: 0.25em; | |
color: #6B6464; | |
} | |
#qunit-tests li a:hover, | |
#qunit-tests li a:focus { | |
color: #000; | |
} | |
#qunit-tests li .runtime { | |
float: right; | |
font-size: smaller; | |
} | |
.qunit-assert-list { | |
margin-top: 0.5em; | |
padding: 0.5em; | |
background-color: #FFF; | |
border-radius: 5px; | |
} | |
.qunit-source { | |
margin: 0.6em 0 0.3em; | |
} | |
.qunit-collapsed { | |
display: none; | |
} | |
#qunit-tests table { | |
border-collapse: collapse; | |
margin-top: 0.2em; | |
} | |
#qunit-tests th { | |
text-align: right; | |
vertical-align: top; | |
padding: 0 0.5em 0 0; | |
font-size: inherit; | |
border: 1px solid #ccc; | |
} | |
#qunit-tests td { | |
vertical-align: top; | |
font-size: inherit; | |
font-family: 'consolas','monospace' | |
} | |
#qunit-tests pre { | |
margin: 0; | |
white-space: pre-wrap; | |
word-wrap: break-word; | |
} | |
#qunit-tests del { | |
background-color: #E0F2BE; | |
color: #374E0C; | |
text-decoration: none; | |
} | |
#qunit-tests ins { | |
background-color: #FFCACA; | |
color: #500; | |
text-decoration: none; | |
} | |
/*** Test Counts */ | |
#qunit-tests b.counts { color: #000; } | |
#qunit-tests b.passed { color: #5E740B; } | |
#qunit-tests b.failed { color: #710909; } | |
#qunit-tests li li { | |
padding: 5px; | |
background-color: #FFF; | |
border-bottom: none; | |
list-style-position: inside; | |
} | |
/*** Passing Styles */ | |
#qunit-tests li li.pass { | |
color: #3C510C; | |
background-color: #FFF; | |
border-left: 10px solid #90FF90; | |
} | |
#qunit-tests .pass {color: #528CE0;background-color: #D2E0E6; } | |
#qunit-tests .pass .test-name { color: #366097; } | |
#qunit-tests .pass .test-actual, | |
#qunit-tests .pass .test-expected { color: #999; } | |
#qunit-banner.qunit-pass { background-color: #90FF90;} | |
/*** Failing Styles */ | |
#qunit-tests li li.fail { | |
color: #710909; | |
background-color: #FFF; | |
border-left: 10px solid #EE5757; | |
white-space: pre; | |
} | |
#qunit-tests > li:last-child { | |
border-radius: 0 0 5px 5px; | |
} | |
#qunit-tests .fail {color: #000;background-color: #EE5757; } | |
#qunit-tests .fail .test-name, | |
#qunit-tests .fail .module-name { color: #000; } | |
#qunit-tests .fail .test-actual { color: #EE5757; } | |
#qunit-tests .fail .test-expected { color: #008000; } | |
#qunit-banner.qunit-fail { background-color: #EE5757; } | |
/*** Skipped tests */ | |
#qunit-tests .skipped { | |
background-color: #EBECE9; | |
} | |
#qunit-tests .qunit-skipped-label { | |
background-color: #F4FF77; | |
display: inline-block; | |
font-style: normal; | |
color: #366097; | |
line-height: 1.8em; | |
padding: 0 0.5em; | |
margin: -0.4em 0.4em -0.4em 0; | |
} | |
/** Result */ | |
#qunit-testresult { | |
padding: 0.5em 1em 0.5em 1em; | |
color: #2B81AF; | |
background-color: #D2E0E6; | |
border-bottom: 1px solid #FFF; | |
} | |
#qunit-testresult .module-name { | |
font-weight: 700; | |
} | |
/** Fixture */ | |
#qunit-fixture { | |
position: absolute; | |
top: -10000px; | |
left: -10000px; | |
width: 1000px; | |
height: 1000px; | |
} | |
</style> | |
<!-- End Unit Tests ========================================================================== --> | |
</div> | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage
@Html.Partial("QUnitTestIf.cshtml", new []{"~/scripts/tests/testfile1.js", "~/scripts/tests/testfile2.js" /*, ...etc...*/ })
If the partial view is called in production or test or anywhere except locally, nothing will be rendered.
Only when served to localhost, unit tests will run if you include
&test=
in thequerystring
.Dependencies
<script src='~/scripts/qunit-1.20.0.js'></script>
Although you'll notice that I also use
<script src='~/scripts/qunit-parameterize.js'></script>