NUnit CollectionOrderedConstraint 在非空 public 只读字段上抛出 NullReference 异常
NUnit CollectionOrderedConstraint throws NullReference exception on a non-null public readonly field
所以我有以下代码用于在 C# 中使用 NUnit 3 进行单元测试:
var skills = new[]
{
new Skill("aaaa"), //parameter is Name
new Skill("kkkk"), //parameter is Name
new Skill("zzzz"), //parameter is Name
};
Assert.That(skills, Is.All.Not.Null);
var skillNames = skills.Select(s => s.Name);
Assert.That(skillNames, Is.All.Not.Null);
Assert.That(skillNames, Contains.Item("aaaa"));
Assert.That(skillNames, Contains.Item("kkkk"));
Assert.That(skillNames, Contains.Item("zzzz"));
Assert.That(skills, Is.Ordered.By("Name")); //Fails
当它到达 Ordered
断言时,它失败并从 CollectionOrderedConstraint.Matches(IEnumerable actual)
抛出 NullReferenceException: Object reference not set to an instance of an object.
。显然,这些值不为空。以下测试成功通过:
var skillNames = new[]
{
new Skill("aaaa").Name,
new Skill("kkkk").Name,
new Skill("zzzz").Name,
};
Assert.That(skillNames, Is.Ordered); //Passes
我知道问题不在于 By
约束,因为此测试也通过了:
var characters = new[]
{
new Character { InterestingTrait = "aaaa" },
new Character { InterestingTrait = "kkkk" },
new Character { InterestingTrait = "zzzz" },
};
Assert.That(characters, Is.Ordered.By("InterestingTrait")); //Passes
我所知道的失败案例和通过案例之间的唯一区别是,在失败案例中,我们正在检查的字段是 public readonly
字段。为什么会抛出空引用异常? NUnit 中是否存在与此相关的已知问题?
这不是成员 readonly
的问题,只是它是一个字段,而不是 属性。要解决此问题,请将您的字段切换为只读 属性、
public string Name { get; }
如果您阅读 NUnit documentation for CollectionOrderedConstraint,或查看 By(string propertyName)
的签名,您会注意到只提到了属性。 NUnit 可能应该处理 public 个字段或给出更好的错误消息,所以我将输入一个问题。
更新: 我进入了issuehttps://github.com/nunit/nunit/issues/2292
所以我有以下代码用于在 C# 中使用 NUnit 3 进行单元测试:
var skills = new[]
{
new Skill("aaaa"), //parameter is Name
new Skill("kkkk"), //parameter is Name
new Skill("zzzz"), //parameter is Name
};
Assert.That(skills, Is.All.Not.Null);
var skillNames = skills.Select(s => s.Name);
Assert.That(skillNames, Is.All.Not.Null);
Assert.That(skillNames, Contains.Item("aaaa"));
Assert.That(skillNames, Contains.Item("kkkk"));
Assert.That(skillNames, Contains.Item("zzzz"));
Assert.That(skills, Is.Ordered.By("Name")); //Fails
当它到达 Ordered
断言时,它失败并从 CollectionOrderedConstraint.Matches(IEnumerable actual)
抛出 NullReferenceException: Object reference not set to an instance of an object.
。显然,这些值不为空。以下测试成功通过:
var skillNames = new[]
{
new Skill("aaaa").Name,
new Skill("kkkk").Name,
new Skill("zzzz").Name,
};
Assert.That(skillNames, Is.Ordered); //Passes
我知道问题不在于 By
约束,因为此测试也通过了:
var characters = new[]
{
new Character { InterestingTrait = "aaaa" },
new Character { InterestingTrait = "kkkk" },
new Character { InterestingTrait = "zzzz" },
};
Assert.That(characters, Is.Ordered.By("InterestingTrait")); //Passes
我所知道的失败案例和通过案例之间的唯一区别是,在失败案例中,我们正在检查的字段是 public readonly
字段。为什么会抛出空引用异常? NUnit 中是否存在与此相关的已知问题?
这不是成员 readonly
的问题,只是它是一个字段,而不是 属性。要解决此问题,请将您的字段切换为只读 属性、
public string Name { get; }
如果您阅读 NUnit documentation for CollectionOrderedConstraint,或查看 By(string propertyName)
的签名,您会注意到只提到了属性。 NUnit 可能应该处理 public 个字段或给出更好的错误消息,所以我将输入一个问题。
更新: 我进入了issuehttps://github.com/nunit/nunit/issues/2292