PlayNicely.Projects
1.0.4-prerelease-20240226-104112
See the version list below for details.
dotnet add package PlayNicely.Projects --version 1.0.4-prerelease-20240226-104112
NuGet\Install-Package PlayNicely.Projects -Version 1.0.4-prerelease-20240226-104112
<PackageReference Include="PlayNicely.Projects" Version="1.0.4-prerelease-20240226-104112"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add PlayNicely.Projects --version 1.0.4-prerelease-20240226-104112
#r "nuget: PlayNicely.Projects, 1.0.4-prerelease-20240226-104112"
// Install PlayNicely.Projects as a Cake Addin #addin nuget:?package=PlayNicely.Projects&version=1.0.4-prerelease-20240226-104112&prerelease // Install PlayNicely.Projects as a Cake Tool #tool nuget:?package=PlayNicely.Projects&version=1.0.4-prerelease-20240226-104112&prerelease
Play Nicely Case Packer
The Play Nicely Case Packer project supports the definition and packaging (for reading or writing) of MSBuild Projects for use in release test cases. While this NuGet package can be used independently its development is a result of the Play Nicely MSBuild tools packages, e.g. NpmNpx or Sass.
Getting Started
This base package supports the definition of a TestCaseProject
via a generic FileSystem
interface.
This interface allows for the definition of directories and files, and also the contents of those
files.
The other artefacts support reading or writing of a TestCaseProject
to media. At time of
writing, the project supports reading from .NET assembly resources and writing to the physical file system.
Implement concrete versions of IProjectPackageReader
and IProjectPackageWriter
if you have a specific
media that you wish to support.
Defining Projects
The TestCaseProject
class represents a virtual project, you can create a FileSystem by adding directories and files
via the FileSystem
object using it's fluent interface. You can also specify the ProjectFile from the same
file system. Once defined the TestCaseProject
doesn't do much on its own, but it is used by the
PlayNicely.Executor package to run test cases.
var testCaseProject = new TestCaseProject("my-project");
var projectFile = testCaseProject.AddDirectory("project1")
.AddFile("proj.csproj");
testCaseProject.ProjectFile = projectFile;
using(var writer = new StreamWriter(projectFile.OpenWriteStream()))
{
writer.WriteLine("<Project Sdk=\"Microsoft.NET.Sdk\">");
writer.WriteLine(" <PropertyGroup>");
writer.WriteLine(" <TargetFramework>netstandard2.0</TargetFramework>");
writer.WriteLine(" </PropertyGroup>");
writer.WriteLine("</Project>");
}
Using Resource (resx) files
Building test case projects in code is fine, but there is already a tool to easily define and edit MSBuild
projects, the IDE. To support this, Case Packer provides a IProjectPackageReader
implementation for .NET
resources. The basic idea is to add file resources to the resx file with names equivalent to the project
file structure. The ResourceSetPackageReader
can then be used to read a package into a test case project,
including the file contents.
Example
If you have the following project structure...
solution-dir
|-- my-project.Specs # BDD Specifications for your project
| |-- TestCases.Projects # Define your test case 'packages' in resx files
| |-- Project1.resx
|-- TestCase.Projects # Define your test case projects in here using familiar tools.
| |-- Project1
| |-- Project1.csproj
| |-- Program.cs
|-- my-solution.sln
The .resx file should have the following resources defined
<?xml version="1.0" encoding="utf-8"?>
<root>
<data name="Project1/Project1.csproj" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Project1/Project1.csproj;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="Project1/Program.cs" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Project1/Program.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
</root>
And then to load these resources into a TestCaseProject
you can...
internal static class TestCases
{
// Where projectName is the same as the resx file name without the extension
public static async Task<TestCaseProject> LoadAsync(string projectName, CancellationToken cancel)
{
ArgumentException.ThrowIfNullOrEmpty(projectName);
cancel.ThrowIfCancellationRequested();
var resourceManager = new ResourceManager($"{ResourceNamespace}.{projectName}", ResourceAssembly);
using var resourceSet = resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true)
?? throw new TestCaseException(string.Format(ContentRes.Error_ProjectNameDoesNotExist, projectName));
using var reader = new ResourceSetBlobReader(resourceSet);
var result = new TestCaseProject(projectName);
await result.LoadFromAsync(reader, cancel);
cancel.ThrowIfCancellationRequested();
return result;
}
public static Assembly ResourceAssembly => _resourceAssembly.Value;
public static string ResourceNamespace => _resourceNamespace.Value;
private static readonly Lazy<Assembly> _resourceAssembly = new(() => typeof(TestCases).Assembly);
private static readonly Lazy<string> _resourceNamespace = new(() => typeof(TestCases).Namespace ?? string.Empty);
}
Learn more about Target Frameworks and .NET Standard.
-
net8.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on PlayNicely.Projects:
Package | Downloads |
---|---|
PlayNicely.Executor
A framework that facilitates testing of Play Nicely functionality. Provides capability to execute programs, in a controlled environment, against test case projects. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.1.3-beta-550 | 93 | 10/4/2024 |
1.1.3-beta-543 | 108 | 9/28/2024 |
1.1.3-beta-535 | 105 | 9/28/2024 |
1.1.3-beta-529 | 92 | 9/23/2024 |
1.1.3-beta-518 | 110 | 9/21/2024 |
1.1.3-beta-511 | 90 | 9/20/2024 |
1.1.3-beta-509 | 94 | 9/20/2024 |
1.1.3-beta-507 | 94 | 9/20/2024 |
1.1.3-beta-505 | 93 | 9/19/2024 |
1.1.3-beta-501 | 119 | 9/18/2024 |
1.1.3-beta-499 | 101 | 9/18/2024 |
1.1.3-beta-496 | 108 | 9/18/2024 |
1.1.2 | 150 | 9/17/2024 |
1.1.2-beta-494 | 102 | 9/18/2024 |
1.1.2-beta-492 | 110 | 9/18/2024 |
1.1.2-beta-487 | 109 | 9/17/2024 |
1.1.1 | 212 | 6/1/2024 |
1.1.1-beta-479 | 118 | 9/14/2024 |
1.1.1-beta-472 | 112 | 9/14/2024 |
1.1.1-beta-465 | 124 | 9/7/2024 |
1.1.1-beta-450 | 103 | 7/14/2024 |
1.1.1-beta-442 | 100 | 7/12/2024 |
1.1.1-beta-432 | 103 | 7/11/2024 |
1.1.1-beta-418 | 102 | 6/1/2024 |
1.1.1-beta-398 | 108 | 6/1/2024 |
1.1.0 | 118 | 5/6/2024 |
1.1.0-beta-393 | 118 | 5/31/2024 |
1.1.0-beta-382 | 131 | 5/21/2024 |
1.1.0-beta-370 | 128 | 5/8/2024 |
1.1.0-beta-355 | 127 | 5/7/2024 |
1.1.0-beta-349 | 125 | 5/7/2024 |
1.1.0-beta-346 | 125 | 5/7/2024 |
1.1.0-beta-340 | 127 | 5/7/2024 |
1.1.0-beta-323 | 121 | 5/6/2024 |
1.0.7 | 334 | 4/11/2024 |
1.0.7-beta-312 | 126 | 4/26/2024 |
1.0.7-beta-299 | 139 | 4/14/2024 |
1.0.7-beta-296 | 123 | 4/14/2024 |
1.0.7-beta-287 | 118 | 4/11/2024 |
1.0.7-beta-282 | 118 | 4/11/2024 |
1.0.7-beta-280 | 125 | 4/10/2024 |
1.0.7-beta-278 | 120 | 4/10/2024 |
1.0.7-beta-276 | 116 | 4/10/2024 |
1.0.7-beta-274 | 142 | 4/9/2024 |
1.0.7-beta-272 | 132 | 4/9/2024 |
1.0.6 | 164 | 3/21/2024 |
1.0.6-beta-266 | 125 | 3/21/2024 |
1.0.6-beta-260 | 124 | 3/21/2024 |
1.0.5 | 207 | 3/10/2024 |
1.0.5-prerelease-20240301-0... | 109 | 3/1/2024 |
1.0.5-beta-227 | 129 | 3/10/2024 |
1.0.5-beta-221 | 137 | 3/9/2024 |
1.0.5-beta-214 | 132 | 3/9/2024 |
1.0.5-beta-208 | 131 | 3/1/2024 |
1.0.5-beta-206 | 127 | 3/1/2024 |
1.0.4 | 127 | 2/29/2024 |
1.0.4-prerelease-20240229-1... | 86 | 2/29/2024 |
1.0.4-prerelease-20240228-0... | 85 | 2/28/2024 |
1.0.4-prerelease-20240226-1... | 106 | 2/26/2024 |