{"id":7291,"date":"2015-08-02T20:50:07","date_gmt":"2015-08-02T20:50:07","guid":{"rendered":"http:\/\/fluentbytes.com\/?p=7291"},"modified":"2015-08-02T20:50:07","modified_gmt":"2015-08-02T20:50:07","slug":"running-xunit-test-with-asp-net-dnx-and-tfs-2015-build","status":"publish","type":"post","link":"https:\/\/fluentbytes.com\/?p=7291","title":{"rendered":"Running XUnit test with ASP.NET DNX and TFS 2015 build"},"content":{"rendered":"<p>Recently I joined a project where they are working on a new application that is based on the new ASP.NET cross platform tooling. While this is still in beta at the moment I write this, we strongly believe in the future of ASP.NET and the ability to run it on multiple platforms. Of course we want this project to start with everything done right from the start, so we are not only writing clean code, we also embrace the continuous delivery concepts and with that we have a strong need of continuous integration and continuous tests. This means we are writing Unit tests from day one and want those integrated in our build system. For the build we use Team Foundation Server 2015 and the new cross platform build system. The challenge I want to discuss today is that the tooling at the moment is still a lot in flux so the unit test tooling for testing cross platform solutions is not fully up to par as you are used to in the \u201cclassic\u201d ASP.NET world on just windows.<\/p>\n<p>So when we want to write unit tests, we need to ensure we use a test framework that also supports running on multiple platforms. At the moment XUnit is the test tooling that is already available for DNX. So let me describe the steps involved for making a set of unit tests and run those tests on the new build platform in TFS 2015.<\/p>\n<p><!--more--><\/p>\n<h2>Start with creating a DNX Unit test project<\/h2>\n<p>First we start with a class library project that is part of the new ASP.NET toolset. In the screenshot here you can see the library project you need to select.<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image002.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image002\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image002_thumb.jpg\" alt=\"clip_image002\" width=\"676\" height=\"388\" border=\"0\" \/><\/a><\/p>\n<p>Next we need to get the XUnit Tools so we can start writing tests. For this you go to the Nuget Package manager for the project and there you select the following packages:<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image004_thumb.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-width: 0px;\" title=\"clip_image004\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image004_thumb.jpg\" alt=\"clip_image004\" width=\"531\" height=\"329\" border=\"0\" \/><\/a><\/p>\n<h4>Ensure your Project.json file contains a test command<\/h4>\n<p>The Project.json file contains besides a set of dependencies also the option to define commands you want to run in the DNX environment. What we are going to do is specify a command called \u201ctest\u201d and we specify we want the XUnit DNX runner to be used for that command. Since we need the test results to be captured in an XML file so we can upload them to TFS as part of the build we specify additional options at the command to output results to an xml file with the \u2013xml option and provide it a file name of the results file. The Project.json file looks then as follows (the blue underline shows the test command:<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image006.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image006\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image006_thumb.jpg\" alt=\"clip_image006\" width=\"674\" height=\"417\" border=\"0\" \/><\/a><\/p>\n<h2>Write a XUnit test<\/h2>\n<p>I won\u2019t go into details about writing XUnit tests, you can read a lot more about this here (<a href=\"http:\/\/xunit.github.io\/docs\/getting-started.html\">http:\/\/xunit.github.io\/docs\/getting-started.html<\/a>) . For now I will show you the code for the class that I called \u201cSomeTests\u201d that contains two tests.<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image008.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image008\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image008_thumb.jpg\" alt=\"clip_image008\" width=\"676\" height=\"399\" border=\"0\" \/><\/a><\/p>\n<h2>Running the test local<\/h2>\n<p>Since we installed the DNX runner using NuGet, after a build the visual studio environment should now show your tests in the test runner automatically after you compile the project.<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image010.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image010\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image010_thumb.jpg\" alt=\"clip_image010\" width=\"400\" height=\"308\" border=\"0\" \/><\/a><\/p>\n<p>So everything now runs in visual studio, question remains can we also do things from the command line? To verify this you can start a command prompt at the current solution and then try to run the command<\/p>\n<p>dnx .\\src\\classlibrary1 test<\/p>\n<p>This will probably result in the error that the command dnx is not recognized. This has to do with the fact that we first need to select the right dnx run environment and you can do so with the command line:<\/p>\n<p>dnvm setup<\/p>\n<p>This will setup the dot net environment and make it part of your current path. Now we need to select a dot net framework we want to run on. Since we want the ability to run on non windows environments you can then select the \u201ccore clr\u201d runtime. You can first list all the runtimes available with the command line:<\/p>\n<p>dnvm list<\/p>\n<p>This shows a list like here below:<\/p>\n<p><span style=\"font-family: 'Courier New';\">Active Version Runtime Architecture Location Alias<\/span><\/p>\n<p><span style=\"font-family: 'Courier New';\">&#8212;&#8212; &#8212;&#8212;- &#8212;&#8212;- &#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8211; &#8212;&#8211;<\/span><\/p>\n<p><span style=\"font-family: 'Courier New';\">1.0.0-beta5 clr x64 C:\\Users\\vries\\.dnx\\runtimes<\/span><\/p>\n<p><span style=\"font-family: 'Courier New';\">1.0.0-beta5 clr x86 C:\\Users\\vries\\.dnx\\runtimes<\/span><\/p>\n<p><span style=\"font-family: 'Courier New';\">1.0.0-beta5 coreclr x64 C:\\Users\\vries\\.dnx\\runtimes<\/span><\/p>\n<p><span style=\"font-family: 'Courier New';\">1.0.0-beta5 coreclr x86 C:\\Users\\vries\\.dnx\\runtimes<\/span><\/p>\n<p>Next I select the runtime I want to use by using the command:<\/p>\n<p><span style=\"font-family: 'Courier New';\">dnvm use 1.0.0-beta5 \u2013architecture x86 \u2013runtime coreclr<\/span><\/p>\n<p>Now we have set up the runtime environment and now you can type the command:<\/p>\n<p><span style=\"font-family: 'Courier New';\">dnx .\\src\\classlibrary1 test<\/span><\/p>\n<p>and now you will see the test results shown at the console:<\/p>\n<p><span style=\"font-family: 'Courier New';\">xUnit.net DNX Runner (32-bit DNXCore 5.0)<\/span><\/p>\n<p><span style=\"font-family: 'Courier New';\">Discovering: ClassLibrary4<\/span><\/p>\n<p><span style=\"font-family: 'Courier New';\">Discovered: ClassLibrary4<\/span><\/p>\n<p><span style=\"font-family: 'Courier New';\">Starting: ClassLibrary4<\/span><\/p>\n<p><span style=\"font-family: 'Courier New';\">Finished: ClassLibrary4<\/span><\/p>\n<p><span style=\"font-family: 'Courier New';\">=== TEST EXECUTION SUMMARY ===<\/span><\/p>\n<p><span style=\"font-family: 'Courier New';\">ClassLibrary4 Total: 2, Errors: 0, Failed: 0, Skipped: 0, Time: 0.106s<\/span><\/p>\n<p>You will now also find an xml file that contains the test results if you look in the location where you executed the command. The result file now contains the test results in the XUnit test format. This format is at the moment not recognized by TFS, they do support MS Test trx format and NUnit out of the box. So we need to do some additional work to make the results usable by TFS build.<\/p>\n<h2>Building the project using TFS build 2015<\/h2>\n<p>Before we can build anything on the server we need to commit our changes locally in our GIT repository and push our changes to the TFS server in a team project that has GIT as version control selected. (you can also work with Team Foundation Server Version control, but since we work cross platform and GIT is available on any platform without MS tools I selected GIT. You could also use Team explorer Everywhere to run from Unix, mac or Linux systems)<\/p>\n<p>In my example here I use Visual studio Online, but this will also work with a on premise server that has TFS 2015 installed. (2015 contains the new Build features I am using here)<\/p>\n<p>When at the TFS web page for build we create a new build definition and call it \u201cASP.NET VNext with XUnit\u201d. Next we start with a build template that has the basic compile things in there.<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image012.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image012\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image012_thumb.jpg\" alt=\"clip_image012\" width=\"313\" height=\"399\" border=\"0\" \/><\/a><\/p>\n<p>Next we add a new build step of type PowerShell script so we can set up the DNX environment like we just did, but now on the build server.<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image014.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image014\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image014_thumb.jpg\" alt=\"clip_image014\" width=\"641\" height=\"413\" border=\"0\" \/><\/a><\/p>\n<p>Move this step to the top of the build, so it becomes the first step<\/p>\n<p>Next we need to add a script to our project to install the dnvm tools and then select the right dnx environment for the compilation of the project to work. If we don\u2019t do this you will get the error message in the compile step:<br \/>\n<strong>Error : The Dnx Runtime package needs to be installed. See output window for more details.<\/strong><\/p>\n<p>You can copy the PowerShell script from the following MSDN page that describes this first step:<\/p>\n<p><a href=\"https:\/\/msdn.microsoft.com\/en-us\/Library\/vs\/alm\/Build\/azure\/deploy-aspnet5\">https:\/\/msdn.microsoft.com\/en-us\/Library\/vs\/alm\/Build\/azure\/deploy-aspnet5<\/a><\/p>\n<p>or just copy the contents here:<\/p>\n<pre># bootstrap DNVM into this session. \n&amp;{$Branch='dev';iex ((new-object net.webclient).DownloadString('https:\/\/raw.githubusercontent.com\/aspnet\/Home\/dev\/dnvminstall.ps1'))}\n# load up the global.json so we can find the DNX version\n$globalJson = Get-Content -Path $PSScriptRoot\\global.json -Raw -ErrorAction Ignore | ConvertFrom-Json -ErrorAction Ignore\nif($globalJson)\n{\n\u00a0\u00a0\u00a0 $dnxVersion = $globalJson.sdk.version\n}\nelse\n{\n\u00a0 Write-Warning \n\"Unable to locate global.json to determine using 'latest'\"\n\u00a0\u00a0\u00a0 $dnxVersion = \"latest\"\n}\n# install DNX\n# only installs the default (x86, clr) runtime of the framework.\n# If you need additional architectures or runtimes you should add additional calls\n# ex: &amp; $env:USERPROFILE\\.dnx\\bin\\dnvm install $dnxVersion -r coreclr\n&amp; $env:USERPROFILE\\.dnx\\bin\\dnvm install $dnxVersion -Persistent # run DNU restore on all project.json files in the src folder \n# including 2&gt;1 to redirect stderr to stdout for badly \n# behaved tools \nGet-ChildItem -Path $PSScriptRoot\\src -Filter project.json -Recurse | ForEach-Object { &amp; dnu restore $_.FullName 2&gt;1 }<\/pre>\n<p>I called the script Install_DNX.ps1 and I added it to the solution items folder in my solution<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image016.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image016\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image016_thumb.jpg\" alt=\"clip_image016\" width=\"398\" height=\"367\" border=\"0\" \/><\/a><\/p>\n<p>Now you can select this file in the PowerShell step as follows:<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image018.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image018\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image018_thumb.jpg\" alt=\"clip_image018\" width=\"644\" height=\"441\" border=\"0\" \/><\/a><\/p>\n<p>When we have this setup, we can now setup the unit testing part. Since the Visual Studio Test step requires an visual studio runner plugin that runs on the full .net framework, I wanted to ensure my tests run clean and also can be run on a build host that I run on a Linux system, so I don\u2019t want to rely on MSTest with an MSTest adapter specified. So I deleted the Visual Studio Test step and replaced it by a PowerShell script that does exactly what we have done in the local run from the command line. So the script for that looks as follows:<\/p>\n<p>Set-ExecutionPolicy unrestricted -Scope CurrentUser -Force<\/p>\n<p>dnvm setup<\/p>\n<p>dnvm use 1.0.0-beta5<\/p>\n<p>dnx $PSScriptRoot\\src\\ClassLibrary4 test.\\nxslt2.exe $PSScriptRoot\\testresults.xml .\\NunitXslt.xslt -o testresultstransformed.xml<\/p>\n<p>Now note the last step of the script. What I did here is leverage a Xslt transformation to change the Xunit format that is currently not recognized by the TFS build an change it to a format it understands Nunit. For this I added an executable called nxslt2.exe that Scott Hanselman described on his blog (<a href=\"http:\/\/www.hanselman.com\/blog\/XSLTWithPowershell.aspx\">http:\/\/www.hanselman.com\/blog\/XSLTWithPowershell.aspx<\/a>) to do simple transformations using PowerShell. I just added the executable also to my solution items folder. The Xslt file I pulled from the github repository of Xunit. In their runners they normally support Nunit as an output format, but this is not supported yet in the dnx runner at the moment. You can find the xslt file here: <a href=\"https:\/\/github.com\/xunit\/xunit\/blob\/master\/src\/xunit.console\/NUnitXml.xslt\">https:\/\/github.com\/xunit\/xunit\/blob\/master\/src\/xunit.console\/NUnitXml.xslt<\/a><\/p>\n<p>I also added this file to my solution items folder, so I have everything in one place. The output of the transformation is now the file called testresultstransformed.xml and that is the file we are going to upload to the TFS server.<\/p>\n<p>I gave the script file the name RunDnxTest.ps1 and placed it in the Solution Items folder. Here you can see the screenshot of my solutions Items folder in my project that includes the Xslt file, the nxslt2.exe file and the PowerShell script:<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image019.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image019\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image019_thumb.png\" alt=\"clip_image019\" width=\"428\" height=\"297\" border=\"0\" \/><\/a><\/p>\n<p>One final thing to note is that the script assumes a directory from which it runs. You can specify this in the PowerShell task and I specified it will be the solution root of my project when it is pulled from the GIT repo:<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image021.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image021\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image021_thumb.jpg\" alt=\"clip_image021\" width=\"663\" height=\"342\" border=\"0\" \/><\/a><\/p>\n<p>And after adding the script to the solution items folder in my solution and pushing it to the remote repo, you can select it as the PowerShell build step to run the tests.<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image022.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image022\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image022_thumb.png\" alt=\"clip_image022\" width=\"663\" height=\"460\" border=\"0\" \/><\/a><\/p>\n<p>Ensure that for the PowerShell task you check the option Continue on Error, since when one of the tests fails otherwise your build will be flagged as failed and no results will be uploaded to the server which is the next task.<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image024.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image024\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image024_thumb.jpg\" alt=\"clip_image024\" width=\"672\" height=\"201\" border=\"0\" \/><\/a><\/p>\n<p>The final thing we want to add is the task to upload the results file after a test is completed.<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image026.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image026\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image026_thumb.jpg\" alt=\"clip_image026\" width=\"676\" height=\"432\" border=\"0\" \/><\/a><\/p>\n<p>When we configure this task we need to select which output result we want to use. Here we select NUnit, since that is the format we transformed the output to in the final step of our PowerShell script that runs the tests. We select the transformed results file and then we are done.<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image028.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image028\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image028_thumb.jpg\" alt=\"clip_image028\" width=\"676\" height=\"242\" border=\"0\" \/><\/a><\/p>\n<p>Now we can queue a build on one of our hosted build machines or on your on premise deployed agent.<\/p>\n<p>In my case I selected my own build server that runs in an Azure virtual machine:<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image030.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image030\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image030_thumb.jpg\" alt=\"clip_image030\" width=\"676\" height=\"399\" border=\"0\" \/><\/a><\/p>\n<p>And after running the build you can now see the test results uploaded to the TFS server:<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image032.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image032\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image032_thumb.jpg\" alt=\"clip_image032\" width=\"676\" height=\"298\" border=\"0\" \/><\/a><\/p>\n<p>And clicking the results there brings you to a view with some charts about your run:<\/p>\n<p><a href=\"\/\/fluentbytes.azurewebsites.net\/wp-content\/uploads\/2015\/08\/clip_image034.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"clip_image034\" src=\"https:\/\/www.fluentbytes.com\/wp-content\/uploads\/2015\/08\/clip_image034_thumb.jpg\" alt=\"clip_image034\" width=\"676\" height=\"346\" border=\"0\" \/><\/a><\/p>\n<h2>Summary<\/h2>\n<p>So after all these steps we have now an ASP.NET DNX Class library project that we can use to define XUnit test and we can run them on the new build infrastructure TFS 2015 provides. The final step here would be to change the scripts from PowerShell to SSH and then run them on a Linux machine, but for that I do need to change the way I do the XSLT transformation ,since the tool is windows only at the moment. I also should change the install DNX script and the Execute DNX tests script to a SSH and then I should be able to run it on a Linux based agent. I leave this as an exercise for later<\/p>\n<p>Hope this helps<\/p>\n<p>Marcel<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recently I joined a project where they are working on a new application that is based on the new ASP.NET cross platform tooling. While this is still in beta at the moment I write this, we strongly believe in the future of ASP.NET and the ability to run it on multiple platforms. Of course we [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[8],"tags":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fluentbytes.com\/index.php?rest_route=\/wp\/v2\/posts\/7291"}],"collection":[{"href":"https:\/\/fluentbytes.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fluentbytes.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fluentbytes.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/fluentbytes.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7291"}],"version-history":[{"count":0,"href":"https:\/\/fluentbytes.com\/index.php?rest_route=\/wp\/v2\/posts\/7291\/revisions"}],"wp:attachment":[{"href":"https:\/\/fluentbytes.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fluentbytes.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fluentbytes.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}