我的场景是从牌组中抽出指定数量的牌并按排序顺序返回(首先是套装,然后是面值)。
<param name="howMany">how many cards to draw.
<returns>a list of drawn cards, sorted by suit and face value (rank)</returns>
我编写了这个方法来实现它。我必须为它编写一个单元测试代码。什么是可能的单元测试,因为它有一个比较列表和如何实现它。
public List<Card> DrawSorted(int howMany)
{
List<Card> drawnCards = _cards.Take(howMany).ToList();
IEnumerable<Card> sortedCards = from card in drawnCards
orderby card.Order ascending
select card;
return sortedCards.ToList();
}
非常感谢任何帮助
答案 0 :(得分:2)
你应该尽可能简单地进行测试,并且应该在这里做几个测试:
一些粗略的想法:
检查订购的一种简单方法是只画一小张卡片(甚至可能只是两张?),然后比较一下;这将使您尽可能地保持测试逻辑的简短和简单,同时仍然能够在出现问题时发出警告。
当然,更好的过程是以开始时的测试形式指定最简单的需求,然后逐步使它们更高级,同时为您的方法添加逻辑。然后你可能会有类似这样的测试(你可能猜到它们可能包含的内容):
public void should_return_correct_nr_of_cards(){ ... }
public void should_return_presorted_cards_in_correct_order(){ ... }
public void should_return_unsorted_cards_sorted(){ ... }
答案 1 :(得分:1)
你要问的第一个问题是“我想测试什么?”。你在测试所有的卡都不一样吗?您是否正在测试当您抽取更多卡片时会发生什么?我自己测试了两个(以及其他一些边缘情况)。
你需要做的第二件事就是提供一些机制来模拟要绘制的牌列表。要使测试有价值,您需要每次都能设置测试条件。
我的建议是像这样创建你的测试类:
public class Deck
{
private List<Card> _cards;
public Deck(List<Card> allCards)
{
_cards = allCards;
}
public List<Card> DrawSorted(int howMany)
{
List<Card> drawnCards = _cards.Take(howMany).ToList();
IEnumerable<Card> sortedCards = from card in drawnCards
orderby card.Order ascending
select card;
return sortedCards.ToList();
}
}
在您的测试课程中,您可以传递要用于测试的完整卡片列表。
根据您使用的测试框架,测试本身会略有不同。但这是一个例子:
[Test]
public void CheckCorrectNumberOfCardsAreReturned()
{
List<Card> allCards = GenerateDeck();
var deck = new Deck(allCards);
var drawnCards = deck.DrawSorted(5);
Assert.AreEqual(5, drawnCards.Count());
}
如果您尝试绘制55张牌,您的测试真正有价值吗?如果你得到55或52(假设一副标准牌)?
如果我的allCards中有重复项,我是否应该在绘制它们时重复,或者应该删除一些重复项?
测试直接与需求相关联 - 确定您的方法应该做什么,并设计测试以确保您的代码符合要求。
最后几点:
答案 2 :(得分:1)
我希望这有帮助!
我认为一个可能的单元测试是在调用DrawSorted后检查结果是否已经排序。
我会创建一个名为IsSorted的其他方法,返回一个bool,然后使用此方法测试输出。
类似的东西:
bool expectedAnswer = true;
List<Cards> list = yourClass.DrawSorted(15);
bool result = yourClass.IsSorted(list);
Assert.AreEqual(expectedResult, result);
或类似的东西。