【问题标题】:Is it possible to add inline C# objects to a theory in xUnit? [duplicate]是否可以将内联 C# 对象添加到 xUnit 中的理论中? [复制]
【发布时间】:2020-08-22 18:47:09
【问题描述】:

我有一些自定义 C# 对象,我想将它们作为 xUnit 的 Theory 中的 InlineData 参数传递。

我尝试the answer in this question 没有任何成功,因为我的对象不是字符串,因此无法创建为编译时常量(属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式)。

这是我尝试过的,

private static readonly Card sevenOfHearts = Card.SevenOfHearts;
private static readonly Card sevenOfSpades = Card.SevenOfSpades;
private static readonly Card sevenOfDiamonds = Card.SevenOfDiamonds;
private static readonly Card sevenOfClubs = Card.SevenOfClubs;

[Theory]
[InlineData(sevenOfHearts)]
[InlineData(sevenOfSpades)]
[InlineData(sevenOfDiamonds)]
[InlineData(sevenOfClubs)]
void Test(
  Card card)
{
  //...
}

但我抱怨说这些对象不是编译时常量

有没有其他选择?

【问题讨论】:

  • 这是错误的确切文本吗?您应该尽可能逐字发布错误消息。
  • 您可以使用 ClassData 而不是 InlineData 来实现这一点(一个很好的例子可以在这里找到andrewlock.net/…)或使用 MemberData
  • 好的,我会发布错误@Wyck的确切文本

标签: c# unit-testing xunit


【解决方案1】:

您可以为此使用MemberData 属性。它应该返回IEnumerable<object[]>,其中每个项目代表您的测试方法的一组参数(在您的情况下只有一个Card 参数,所以只有一个项目)

public static IEnumerable<object[]> Cards
{
    get
    {
        yield return new object[] { Card.SevenOfHearts };
        yield return new object[] { Card.SevenOfSpades };
        yield return new object[] { Card.SevenOfDiamonds };
        yield return new object[] { Card.SevenOfClubs };
    }
}

[Theory]
[MemberData(nameof(Cards))]
void Test(Card card)   
{    
}

【讨论】:

  • 顺便说一句,IEnumerable 也需要公开。
猜你喜欢
  • 2016-07-25
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2010-11-06
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多