TestBase.Mvc.AspNetCore
4.1.2.2
dotnet add package TestBase.Mvc.AspNetCore --version 4.1.2.2
NuGet\Install-Package TestBase.Mvc.AspNetCore -Version 4.1.2.2
<PackageReference Include="TestBase.Mvc.AspNetCore" Version="4.1.2.2" />
paket add TestBase.Mvc.AspNetCore --version 4.1.2.2
#r "nuget: TestBase.Mvc.AspNetCore, 4.1.2.2"
// Install TestBase.Mvc.AspNetCore as a Cake Addin #addin nuget:?package=TestBase.Mvc.AspNetCore&version=4.1.2.2 // Install TestBase.Mvc.AspNetCore as a Cake Tool #tool nuget:?package=TestBase.Mvc.AspNetCore&version=4.1.2.2
TestBase gives you a flying start with
- fluent assertions that are easy to extend
- sharp error messages
- tools to help you test with “heavyweight” dependencies on
-
- AspNet.Mvc or AspNetCore Contexts
- HttpClient
- Ado.Net
- Streams & Logging
-
Chainable fluent assertions get you to the point concisely:
UnitUnderTest.Action()
.ShouldNotBeNull()
.ShouldEqualByValueExceptFor(new {Id=1, Descr=expected}, ignoreList )
.Payload
.ShouldMatchIgnoringCase("I expected this")
.Should(someOtherPredicate);
.Items
.ShouldAll(predicate)
.ShouldContain(item)
.ShouldNotContain(predicate)
.Where(predicate)
.SingleOrAssertFail()
.ShouldEqualByValue().ShouldEqualByValueExceptFor(...)
work with all kinds of object and collections, and report what differed.
string.ShouldMatch(pattern).ShouldNotMatch().ShouldBeEmpty().ShouldNotBeEmpty()
.ShouldNotBeNullOrEmptyOrWhiteSpace().ShouldEqualIgnoringCase()
.ShouldContain().ShouldStartWith().ShouldEndWith().ShouldBeContainedIn(), ...
numeric.ShouldBeBetween().ShouldEqualWithTolerance()....GreaterThan....LessThan...GreaterOrEqualTo ...
ienumerable.ShouldAll().ShouldContain().ShouldNotContain().ShouldBeEmpty().ShouldNotBeEmpty() ...
stream.ShouldHaveSameStreamContentAs().ShouldContain()
value.ShouldBe().ShouldNotBe().ShouldBeOfType().ShouldBeAssignableTo()...
TestBase.HttpClient.Fake
[Test]
public async Task Should_MatchTheRightExpectationAndReturnTheSetupResponse__GivenMultipleSetups()
{
var httpClient = new FakeHttpClient()
.Setup(x=>x.Method==HttpMethod.Put).Returns(new HttpResponseMessage(HttpStatusCode.Accepted))
.Setup(x=>x.RequestUri.PathAndQuery.StartsWith("/this")).Returns(thisResponse)
.Setup(x=>x.RequestUri.PathAndQuery.StartsWith("/that")).Returns(thatResponse)
.Setup(x=>x.RequestUri.PathAndQuery.StartsWith("/forbidden")).Returns(new HttpResponseMessage(HttpStatusCode.Forbidden));
(await httpClient.GetAsync("http://localhost/that")).ShouldEqualByValue(thatResponse);
(await httpClient.GetAsync("http://localhost/forbidden")).StatusCode.ShouldBe(HttpStatusCode.Forbidden);
httpClient.Verify(x=>x.Method==HttpMethod.Put);
httClient.VerifyAll();
}
TestBase.FakeDb
Works with Ado.Net
- fakeDbConnection.SetupForQuery(IEnumerable<TFakeData>; )
- fakeDbConnection.SetupForQuery(IEnumerable<Tuple<TFakeDataForTable1,TFakeDataForTable2>> )
- fakeDbConnection.SetupForQuery(fakeData, new[] {"FieldName1", FieldName2"})
- fakeDbConnection.SetupForExecuteNonQuery(rowsAffected)
- fakeDbConnection.ShouldHaveUpdated("tableName", [Optional] fieldList, whereClauseField)
- fakeDbConnection.ShouldHaveSelected("tableName", [Optional] fieldList, whereClauseField)
- fakeDbConnection.ShouldHaveUpdated("tableName", [Optional] fieldList, whereClauseField)
- fakeDbConnection.ShouldHaveDeleted("tableName", whereClauseField)
- fakeDbConnection.ShouldHaveInvoked(cmd => predicate(cmd))
- fakeDbConnection.ShouldHaveXXX().ShouldHaveParameter("name", value)
- fakeDbConnection.Verify(x=>x.CommandText.Matches("Insert [case] .*") && x.Parameters["id"].Value==1)
TestBase.RecordingDb
new RecordingDbConnection(IDbConnection)
helps you profile Ado.Net Db calls
TestBase.Mvc.AspNetCore & TestBase.Mvc
ControllerUnderTest.Action()
.ShouldbeViewResult()
.ShouldHaveModel<TModel>()
.ShouldEqualByValue(expected)
ControllerUnderTest.Action()
.ShouldBeRedirectToRouteResult()
.ShouldHaveRouteValue("expectedKey", [Optional] "expectedValue");
ShouldHaveViewDataContaining(), ShouldBeJsonResult() etc.
Quickly test AspNetCore controllers with zero setup, even with Action dependencies on HttpContext, Request, Response, ViewData, UrlHelper using controllerUnderTest.WithControllerContext()
:
[TestFixture]
public class WhenTestingControllersUsingFakeControllerContext
{
[Test]
public void ShouldBeViewWithModel_ShouldAssertViewResultAndNameAndModel_And_UrlHelper_ShouldWork()
{
var controllerUnderTest =
new AController()
.WithControllerContext();
var result= controllerUnderTest
.Action("SomeController","SomeAction",other:1)
.ShouldBeViewWithModel<AClass>("ViewName");
.FooterLink
.ShouldBe("/Controller/Action?other=1");
}
}
... Or test against complex application dependencies using HostedMvcTestFixtureBase
and specify your Startup
class:
[TestFixture]
public class WhenTestingControllersUsingAspNetCoreTestTestServer : HostedMvcTestFixtureBase
{
[TestCase("/dummy/action?id={id}")]
public async Task Get_Should_ReturnActionResult(string url)
{
var id=Guid.NewGuid();
var httpClient=GivenClientForRunningServer<Startup>();
GivenRequestHeaders(httpClient, "CustomHeader", "HeaderValue1");
var result= await httpClient.GetAsync(url.Formatz(new {id}));
result
.ShouldBe_200Ok()
.Content.ReadAsStringAsync().Result
.ShouldBe("Content");
}
[TestCase("/dummy")]
public async Task Put_Should_ReturnA(string url)
{
var something= new Fixture().Create<Something>();
var jsonBody= new StringContent(something.ToJSon(), Encoding.UTF8, "application/json");
var httpClient=GivenClientForRunningServer<Startup>();
GivenRequestHeaders(httpClient, "CustomHeader", "HeaderValue1");
var result = await httpClient.PutAsync(url, jsonBody);
result.ShouldBe_202Accepted();
DummyController.Putted.ShouldEqualByValue( something );
}
}
TestBase.Mvc for Mvc4 and Mvc 5
Use the Controller.WithHttpContextAndRoutes()
extension methods to fake the
http request & context. And, by injecting the RegisterRoutes method of your
MvcApplication, you can use and test Controller.Url with your application's configured routes.
ControllerUnderTest
.WithHttpContextAndRoutes(
[Optional] Action<RouteCollection> mvcApplicationRoutesRegistration,
[optional] string requestUrl,
[Optional] string query = "",
[Optional] string appVirtualPath = "/",
[Optional] HttpApplication applicationInstance)
ApiControllerUnderTest.WithWebApiHttpContext<T>(
HttpMethod httpMethod,
[Optional] string requestUri,
[Optional] string routeTemplate)
Testable Logging with StringListLogger
Extensions.Logging.ListOfString
for Microsoft.Extensions.Logging.Abstractions:
var logger= new LoggerFactory.AddProvider(new StringListLoggerProvider()).CreateLogger("Test1");
// or
var loggedLines = new List<string>();
var logger= new LoggerFactory().AddStringListLogger(loggedLines).CreateLogger("Test2");
... ;
StringListLogger.Instance
.LoggedLines
.ShouldContain(x=>x.Matches("kilroy was here"));
Serilog.Sinks.ListOfString
for Serilog:
var loglines= new List<String>();
var logger=new LoggerConfiguration().WriteTo.StringList(loglines).CreateLogger();
... ;
logLines.ShouldContain(x=>x.Matches("kilroy was here"));
PDFs
TestBase.Pdf.DocumentWithLineOfText(myLineOfText)
gives you a small but well-formed PDF document to play with.
(taken from https://www.cafe-encounter.net/p521/a-very-small-editable-pdf-for-testing)
- Mix and match with your favourite test runners and assertions
- Building on Mono : define compile symbol NoMSTest to remove dependency on Microsoft.VisualStudio.QualityTools.UnitTestFramework
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.AspNetCore (>= 2.0.1)
- Microsoft.AspNetCore.Mvc (>= 2.0.2)
- Microsoft.AspNetCore.TestHost (>= 2.0.1)
- Moq (>= 4.8.2)
- TestBase (>= 4.1.2.3)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on TestBase.Mvc.AspNetCore:
Package | Downloads |
---|---|
TestBase.Mvc
*TestBase* gives you a flying start with - fluent assertions that are easy to extend - sharp error messages - tools to help you test with “heavyweight” dependencies on - AspNetCore.Mvc, AspNet.Mvc or WebApi Contexts - HttpClient - Ado.Net - Streams & Logging TestBase.Mvc is renamed to https://www.nuget.org/packages/TestBase.Mvc.AspNetCore Use https://www.nuget.org/packages/TestBase-Mvc for Mvc 4. Chainable fluent assertions get you to the point concisely: ``` - ShouldEqualByValue() & ShouldEqualByValueExceptFor() work with all kinds of object and collections, and report what differed. - string.ShouldMatch().ShouldEqualIgnoringCase(), ... - numeric.ShouldBeBetween().ShouldEqualWithTolerance(), ... - IEnumerable.ShouldAll().ShouldContain().ShouldNotContain(), ... ``` TestBase.Mvc.AspNetCore & TestBase-Mvc ------------ ``` ControllerUnderTest.Action() .ShouldbeViewResult() .ShouldHaveModel<TModel>() .Payload .ShouldEqualByValueExceptFor(new {Id=1, Payload1=expected}, ignoreFields); ControllerUnderTest.Action() .ShouldBeRedirectToRouteResult() .ShouldHaveRouteValue(""expectedKey"", [Optional] ""expectedValue""); ShouldHaveViewDataContaining(), ShouldBeJsonResult() etc. ``` Quickly test AspNetCore controllers with zero setup using `WithControllerContext()` : ``` [Test] public void ControllerUrlAndOtherPropertiesShouldWorkAsExpected__GivenControllerContext() { var uut = new FakeController().WithControllerContext(); uut.Url.Action(""a"", ""b"").ShouldEqual(""/b/a""); uut.ControllerContext.ShouldNotBeNull(); uut.HttpContext.ShouldBe(uut.ControllerContext.HttpContext); uut.ControllerContext.HttpContext.Request.ShouldNotBeNull(); uut.Request.ShouldNotBeNull(); uut.Response.ShouldNotBeNull(); uut.Url.ShouldNotBeNull(); uut.ViewData.ShouldNotBeNull(); uut.TempData.ShouldNotBeNull(); uut.MyAction(param) .ShouldBeViewResult() .ShouldHaveModel<YouSaidViewModel>() .YouSaid.ShouldBe(param); } [Test] public void ShouldBeViewWithModel_And_UrlHelper_ShouldWork() { var controllerUnderTest = new AController() .WithControllerContext(virtualPathTemplate:""/{Action}/Before/{Controller}""); var result= controllerUnderTest .Action(""SomeController"",""SomeAction"") .ShouldBeViewWithModel<AClass>(""ViewName""); .FooterLink .ShouldBe(""/SomeAction/Before/SomeController""); } ``` ... Or test against complex application dependencies using `HostedMvcTestFixtureBase` and specify your `Startup` class: ``` [TestFixture] public class Tests : HostedMvcTestFixtureBase { [TestCase(""/dummy/action?id={id}"")] public async Task Get_Should_ReturnActionResult(string url) { var id=Guid.NewGuid(); var httpClient=GivenClientForRunningServer<Startup>(); GivenRequestHeaders(httpClient, ""CustomHeader"", ""HeaderValue1""); var result= await httpClient.GetAsync(url.Formatz(new {id})); result .ShouldBe_200Ok() .Content.ReadAsStringAsync().Result .ShouldBe(""Content""); } [TestCase(""/dummy"")] public async Task Put_Should_ReturnA(string url) { var something= new Fixture().Create<Something>(); var jsonBody= new StringContent(something.ToJSon(), Encoding.UTF8, ""application/json""); var httpClient=GivenClientForRunningServer<Startup>(); GivenRequestHeaders(httpClient, ""CustomHeader"", ""HeaderValue1""); var result = await httpClient.PutAsync(url, jsonBody); result.ShouldBe_202Accepted(); DummyController.Putted.ShouldEqualByValue( something ); } } ``` See also - TestBase - TestBase-Mvc for Mvc4 - TestBase.HttpClient.Fake - TestBase.AdoNet - Serilog.Sinks.ListOfString - Extensions.Logging.ListOfString |
GitHub repositories
This package is not used by any popular GitHub repositories.
ChangeLog
---------
4.1.2.0 TestBase.Mvc.AspNetCore provides WithControllerContext() and TestServerBuilder
4.0.7.0 Added TestBase.FakeHttpClient. Added Should(predicate,...) as synonym of ShouldHave(predicate,...)
4.0.6.2 TestBase.Mvc can run controller actions on aspnetcore using controller.WithControllerContext()
4.0.5.2 TestBase.Mvc partially ported to netstandard20 / AspNetCore
4.0.4.1 StreamShoulds
4.0.3.0 StringListLogger as MS Logger and as Serilogger
4.0.1.0 Port to NetCore
3.0.3.0 Improves FakeDb setup
3.0.x.0 adds and/or corrects missing Shoulds()
2.0.5.0 adds some intellisense and FakeDbConnection.Verify(..., message,args) overload