2014-02-21 80 views
2

我有的场景是从卡组中抽取指定数量的卡片并按排序顺序(首先是西装,然后是面值)返回它们。使用Assert的单元测试案例

<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(); 
} 

任何帮助深表感谢

回答

2

你应该让测试尽可能的简单,并应可能使一些测试在这里:

一些粗略的想法:

  • 一个验证你画和返回的卡
  • 正确的号码
  • 一个检查如果您绘制的卡片按照正确的顺序开始,您仍然可以按照正确的顺序将它们取回
  • 一个用于检查卡片是否以正确顺序返回正确或DER。

一个简单的方法来检查排序是通过只画一小块卡片(甚至可能只是两个?),并比较它们;这将使您尽可能简化测试逻辑,同时在出现问题时仍能够发出警告。

当然更好的过程会一直到指定的测试形式最简单的要求开始,然后做一点他们更先进位,同时加入的逻辑来你的方法,你去。那么你可能测试命名为这样的事情(你可能已经猜到,他们可能包含的内容):

public void should_return_correct_nr_of_cards(){ ... } 

public void should_return_presorted_cards_in_correct_order(){ ... } 

public void should_return_unsorted_cards_sorted(){ ... } 
+0

其实这不是一个问题,有牌的排序甲板上,然后用第N卡从这个分类结果进行比较甲板。我也会重命名这个方法,因为它不会*画*卡。我会添加测试以验证不正确的* howMany *值的行为(零,小于零,然后是套牌大小) –

+0

好点。虽然方法名称没有说明它正在测试绘图,但严格来说,我现在仍然重命名它,使其更简单一些,不太可能被误解。这是一个开始;我想你可以添加更多的测试,例如去测试各种潜在的错误,但我也不想过度。你不应该觉得你_absolutely有to_测试每一种可能的不测事件 - 刚刚够,你可以感受到有理由相信你的代码。 – Kjartan

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(假设一副标准牌)?

如果我在我的所有卡片中有重复的内容,当我绘制它们或应该删除某些内容时,是否应该得到重复的内容?

测试与需求直接挂钩 - 弄清楚你的方法应该做什么并设计你的测试以确保你的代码符合要求

一对夫妇最后的点:

  • 一个测试应该测试一个边缘情况/件的行为,这往往会导致每个方法的多个测试
  • 测试应该知道初始条件(可以配置你的卡组给予你想要的测试条件)
  • 一个测试应该是可重复的,对诸如随机数的事情要小心。从两个牌组中抽出一张随机牌并检查他们是不是一样? 1/52他们可能是!这些测试是诊断的噩梦。
1

我希望这有助于!

我认为一个可能的单元测试是检查结果是否已在调用DrawSorted后排序。

我会创建其他方法称为IsSorted,返回一个布尔值,然后使用此方法来测试输出。

喜欢的东西:

bool expectedAnswer = true; 

List<Cards> list = yourClass.DrawSorted(15); 
bool result = yourClass.IsSorted(list); 

Assert.AreEqual(expectedResult, result); 

或者是这样的。