【问题标题】:C# Xunit testing a list that must contain 4 of each valueC# Xunit 测试一个列表,每个值必须包含 4 个
【发布时间】:2021-01-30 14:57:41
【问题描述】:

所以我正在练习单元测试 (Xunit) 和 C#。我正在制作一个扑克游戏机应用程序。我有一个包含 52 张卡片的卡片组。该列表由 Card 类组成,每张牌都有一个 int 值,表示它是什么牌,例如值 1 是王牌,值 13 是国王。 我如何进行单元测试来检查 52 张卡的列表是否每个值都有 4 个?我只是为了练习而做的,想不出一个不太复杂的单元测试。

这里的卡片类非常简单:

public class Card
{
    public enum Suit
    {
        HEART = 1,
        SPADE,
        CLUB,
        DIAMOND
    }

    public int value { get; set; }
    public int suit { get; set; }
    public char letter { get; set; }
}

CreateDeck() 方法创建并返回卡片组:

public class CardDeck
{
    public static List<Card> CreateDeck()
    {
        List<Card> cardDeck = new List<Card>();
        int maxCards = 52;

        int currentCardValue = 1;
        int currentSuitValue = 1;
        
        for (int i = 0; i < maxCards; i++)
        {
            cardDeck.Add(new Card { value = currentCardValue, suit = currentSuitValue, letter = Card.ReturnLetter(currentCardValue) });
            currentSuitValue++;
            if (currentSuitValue > 4) { currentSuitValue = 1; }
            //After 4 cards of the same value we raise the cards value
            if(i + 1 % 4 == 0)
            {
                currentCardValue++;
            }
        }
        return cardDeck;
    }
}

所以我想做一个 Xunit 测试:

 [Fact]
        public void CardDeck_ShouldHave4CardsOfEachValue()
        {
            List<Card> cardDeck = CardDeck.CreateDeck();

            ??????

        }

【问题讨论】:

  • var ok = !cardDeck.GroupBy( x =&gt; x.value).Any( g =&gt; g.Count != 4);

标签: c# unit-testing xunit


【解决方案1】:

您的断言可以按值对卡片进行分组。然后,您总共有 13 个组(每个花色中有 13 张不同价值的牌)。或者,您可以按套装分组,这意味着 4 个组有 13 名成员......虽然这并不能证明它们是独一无二的)。

对于前者,

Assert(cardDeck.GroupBy(x =&gt; x.value).Count() == 13).

当然,将该断言更改为您正在使用的测试包的断言语言(不确定 XUnit),例如如果使用Fluent Assertions,那就是

cardDeck.GroupBy(x =&gt; x.value).Should().HaveCount(13)

还有几点说明:

  • 您当前的算法不正确。它会失败这个断言。我把它留给你。
  • 这并不能证明 suit 的值是正确的,例如,特别是因为您使用 int 表示 suit,尽管将其声明为枚举

【讨论】:

  • 这只检查了套牌有 13 个不同的花色组,但它没有检查每个值有 4 张牌。我用 5 个 A 和 3 个 K 尝试过,它通过了。但无论如何,谢谢让我朝着正确的方向前进
【解决方案2】:

于是我查了一些LINQ库中的方法,找到了解决办法:

        [Fact]
        public void CardDeck_ShouldHave4CardsOfEachValue()
        {
            List<Card> cardDeck = CardDeck.CreateDeck();

            for(int i = 1; i <= cardDeck.Count / 4; i++)
            {
                var cardsWithIteratedValue = cardDeck.Where(x => x.value == i);
                Assert.True(cardsWithIteratedValue.Count() == 4);
            }

        }

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2017-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多