Functional Testing of Cmdlets

Heath Stewart

While developing unit and functional tests for Windows Installer PowerShell Extensions, I needed a way to invoke cmdlets without requiring elevation on Vista. That is, of course, because running elevated has always been a bad idea unless it is required. In order to load a PowerShell snap-in, however, one must write to HKEY_LOCAL_MACHINE which requires elevated privileges. Other than that, there really isn’t another reason to run elevated.

Fortunately, PowerShell allows developers to define a RunspaceConfiguration object which, among other properties, allows developers to add specific types as cmdlets. Without being defined by a registered snap-in, cmdlets can then be invoked in a Runspace as shown below in a sample Visual Studio test class.

using System;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using Microsoft.Windows.Installer.PowerShell.Commands;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class GetFileHashCommandTest
{
    private RunspaceConfiguration config;
    [TestInitialize]
    public void Initialize()
    {
        config = RunspaceConfiguration.Create();
        config.Cmdlets.Append(new CmdletConfigurationEntry(
            "Get-MSIFileHash",
            typeof(GetFileHashCommand),
            "Microsoft.Windows.Installer.PowerShell.dll-Help.xml"));
    }
    [TestMethod]
    [DeploymentItem(@"data\example.txt")]
    public void PathTest()
    {
        using (Runspace rs = RunspaceFactory.CreateRunspace(config))
        {
            rs.Open();
            using (Pipeline p = rs.CreatePipeline(@"get-msifilehash -path example.txt"))
            {
                Collection<PSObject> objs = p.Invoke();
                Assert.AreEqual<int>(1, objs.Count);
            }
        }
    }
}

When it is time to install and register your PowerShell snap-in, I recommend you take a look at the WiX PowerShell extension to avoid using managed custom actions which can also cause problems.

0 comments

Discussion is closed.

Feedback usabilla icon