【问题标题】:NUnit CollectionOrderedConstraint throws NullReference exception on a non-null public readonly fieldNUnit CollectionOrderedConstraint 在非空公共只读字段上引发 NullReference 异常
【发布时间】:2017-06-30 14:52:14
【问题描述】:

所以我有以下代码用于在 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

我所知道的失败案例和通过案例之间的唯一区别是,在失败案例中,我们正在检查的字段是公共readonly 字段。为什么会抛出空引用异常? NUnit 中是否存在已知问题?

【问题讨论】:

标签: c# nunit nunit-3.0


【解决方案1】:

这不是readonly 成员的问题,只是因为它是一个字段,而不是一个属性。要解决此问题,请将您的字段切换为只读属性,

public string Name { get; }

如果您阅读NUnit documentation for CollectionOrderedConstraint,或查看By(string propertyName) 的签名,您会注意到只提到了属性。 NUnit 应该可以处理公共字段或提供更好的错误消息,所以我将输入一个问题。

更新:我进入问题https://github.com/nunit/nunit/issues/2292

【讨论】:

  • 这确实解决了问题,将值从字段更改为属性。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
相关资源
最近更新 更多