2016-11-29 29 views
0

假設我有一個C#Cmdlet從管道接受值的值:如何測試經由管道供給到C#小命令

[System.Management.Automation.Parameter(Position = 0, Mandatory = true, ValueFromPipeline=true)] 
public string Query 
{ 
    get { return query; } 
    set { query = value; } 
} 
private string query; 

我測試:

[TestMethod()] 
public void ShouldReturnAnInfoObjectCollection() 
{ 

    // arrange 
    string query = "SELECT si_id, si_name FROM ci_infoobjects WHERE si_id=23"; 
    InfoObjects actual = null; 

    GetInfoObjects cmdlet = new GetInfoObjects(); 
    cmdlet.Query = query; 

    // act 
    IEnumerator result = cmdlet.Invoke().GetEnumerator(); 
    while (result.MoveNext()) 
    { 
     actual = ((InfoObjects)result.Current); 
    } 

    // assert 
    Assert.IsInstanceOfType(actual, typeof(InfoObjects)); 

} 

如何我會測試這個Cmdlet的能力,通過管道接受Query的值嗎?

回答

0

Using Pipeline.Input for Powershell testing有幫助。

配置運行空間:

[ClassInitialize()] 
public static void MyClassInitialize(TestContext testContext) 
{ 
    config = RunspaceConfiguration.Create(); 
} 

創建測試:

[TestMethod()] 
public void Get_InfoObjects_with_multiple_values_from_pipeline() 
{ 

    // "SELECT ..." | Get-InfoObjects ... 

    // 
    // arrange 
    // 

    string[] queries = { "SELECT * FROM ci_infoobjects WHERE si_id=23", "SELECT * FROM ci_infoobjects WHERE si_id=4" }; 

    Command command = new Command("Get-InfoObjects"); 

    using (Runspace runspace = RunspaceFactory.CreateRunspace(config)) 
    { 

     runspace.Open(); 

     using (Pipeline pipeline = runspace.CreatePipeline()) 
     { 

      foreach (string query in queries) 
      { 
       pipeline.Input.Write(query); 
      } 

      pipeline.Commands.Add(command); 

      // 
      // act 
      // 

      var actual = pipeline.Invoke(); 

      // 
      // assert 
      // 

      Assert.AreEqual(1, actual.Count); 
      Assert.IsInstanceOfType(actual[0], typeof(System.Management.Automation.PSObject)); 

     } // using Pipeline 
    } // using // Runspace 

} // test 
0

如果這是您的cmdlet:

[Cmdlet("Load" , "Item", DefaultParameterSetName="Item")] 
public class LoadCommand : Cmdlet 
{ 
    private string assembly; 

    [Parameter(Mandatory=true, ValueFromPipeline=true, ParameterSetName="Item", Position=0, HelpMessageResourceId="LoadCmdlet_Item")] 
    public string Assembly 
    { 
     get { return assembly; } 
     set { assembly = value; } 
    } 

    protected override void ProcessRecord() 
    { 
     base.ProcessRecord(); 

     if (File.Exists(assembly)) 
     { 
      WriteObject(Assembly.LoadFrom(fileName)); 
      return; 
     } 
    } 

} 

您可以編寫可以通過輸入到cmdlet測試。以下是真正的cmdlet測試發生的位置:

[TestMethod] 
public void ShouldLoadAssemblyWithFileName() 
{ 
    string asmFile = this.GetType().Module.FullyQualifiedName; 

    LoadCommand cmd = new LoadCommand(); 
    cmd.Item = asmFile; 

    IEnumerator result = cmd.Invoke().GetEnumerator(); 

    Assert.IsTrue(result.MoveNext()); 
    Assert.IsTrue(result.Current is Assembly); 

    Assert.AreEqual(this.GetType().Assembly.FullName, ((Assembly)result.Current).FullName); 
} 
+0

感謝您的答覆。我明白如何編寫一個接受和處理管道數據的'Cmdlet'。我想知道的是如何爲此編寫單元測試。 – craig

+0

對不起,沒有進攻,看到更新 – Yaser

+0

設置'cmd.Item = asmFile'真的是測試該參數接受管道值的能力嗎? – craig