我正在使用 .NET Framework 4.7.1 和 Visual Studio 2017 开发 C# 库。
我想测试这个方法:
private void AddProductionRule(
string bnfLine,
Dictionary<string, string[]> productionRules)
{
if (productionRules == null)
productionRules = new Dictionary<string, string[]>();
string[] stringSplitted = bnfLine.Split(new[] { "::=" }, StringSplitOptions.None);
string key = stringSplitted[0].Trim();
string[] rules;
stringSplitted[1] = Regex.Replace(stringSplitted[1], "[::=\r\n]", string.Empty).Trim();
rules = stringSplitted[1].Split('|').Select(rule => rule.Trim()).ToArray();
productionRules.Add(key, rules);
}
使用此 Nunit 方法:
[Test]
public void ShouldAddProductionRule()
{
// Arrange
PrivateObject privateObject = new PrivateObject(grammar);
string line = "<expr> ::= <expr><op><expr>\r\n| (<expr><op><expr>)\r\n| <pre_op>(<expr>)\r\n| <var>";
Dictionary<string, string[]> expectedRules = new Dictionary<string, string[]>
{
{ "<expr>", new string[] { "<expr><op><expr>", "(<expr><op><expr>)", "<pre_op>(<expr>)", "<var>" } }
};
Dictionary<string, string[]> actualRules = null;
object[] args = new object[2] { line, actualRules };
// Act
privateObject.Invoke("AddProductionRule", args);
actualRules = args[1] as Dictionary<string, string[]>;
// Assert
NUnit.Framework.CollectionAssert.AreEqual(expectedRules, actualRules);
}
但它失败了,因为actualRules
仍然为空,我不知道如何从(Nuget )获取productionRules
字典的值。PrivateObject
<package id="Microsoft.VisualStudio.QualityTools.UnitTestFramework.Updated" version="15.0.26228" targetFramework="net471" />
如果我添加out
到参数,我会在这里得到一个错误:if (productionRules == null)
. 我认为该方法应该有效,因为productionRules
它是一个参考。
我曾想过从Key, Value
方法中返回这对,但我不知道如何声明它。
如何使用 测试此方法PrivateObject
?