【发布时间】:2011-12-30 20:03:36
【问题描述】:
我正在写一个纸牌游戏来尝试学习 Silverlight。
我有游戏的域表示,它作为 WCF 服务暴露给 Silverlight,我的游戏对象上唯一的公共方法是“PlayCards”。这是一个看起来像这样的方法
public void PlayCards(Guid playerId, List<Card> cards)
当调用此方法时,Game 对象会更新并使用双工绑定传输给所有客户端
我需要对很多场景进行单元测试(通过 UI 进行测试变得非常乏味,尤其是因为有很多场景并不经常自然发生)。但是,这样做意味着公开各种真正不需要的属性(除了我的测试目的)
这里有一些细节:
我有一个包含玩家列表的游戏类:
public class Game
{
public List<Player> Players
{
get { return _players; }
}
...
Player 类有一个 Hand
public class Player
{
public Hand Hand { get; internal set; }
...
Hand 类有不同的部分
public class Hand
{
public List<Card> FaceDownCards { get; internal set; }
public List<Card> FaceUpCards { get; internal set; }
public List<Card> InHandCards { get; internal set; }
现在,在我的单元测试中,我想设置各种场景,其中一个玩家有某些牌,而下一个玩家有某些牌。然后让第一个玩家玩一些牌(通过公共 PlayCards 方法),然后断言游戏状态
当然,由于 Players 是只读属性,我不能这样做。同样,手(在播放器上)是不可访问的。手的部分也是如此。
有什么想法可以设置吗?
我猜这可能意味着我的设计是错误的?
谢谢
编辑:
下面是一些类的样子,让您了解我想在打出纸牌后断言的一些属性
在我尝试 InternalsToVisible 时,我暂时将私有设置器更改为 internal,但我对纯 TDD 的做事方式很感兴趣
public class Game
{
public List<Player> Players { get; internal set; }
public Deck Deck { get; internal set; }
public List<Card> PickUpPack { get; internal set; }
public CardList ClearedCards { get; internal set; }
public Player CurrentPlayer
{
get
{
return Players.SingleOrDefault(o => o.IsThisPlayersTurn);
}
}
internal Direction Direction { get; set; }
..
public class Player
{
public Guid Id { get; internal set; }
public Game CurrentGame { get; internal set; }
public Hand Hand { get; internal set; }
public bool IsThisPlayersTurn { get; internal set; }
public bool IsAbleToPlay { get; internal set; }
public string Name { get; internal set; }
...
public class Hand
{
public List<Card> FaceDownCards { get; internal set; }
public List<Card> FaceUpCards { get; internal set; }
public List<Card> InHandCards { get; internal set; }
...
【问题讨论】:
-
哎呀 - 我最初严重误读了这个问题。如何初始化
Game的_players?以及如何初始化Player的手(以此类推)? -
游戏有一个 AddPlayer 方法,当客户端加入游戏时,该方法通过 WCF 服务层调用......当有正确数量的玩家时,调用 GameStart 方法,该方法洗牌并分发以特定方式的卡片。因此无需公开访问玩家或手牌
标签: c# unit-testing