C# 如何测试同一类的对象是否接收到事件
我有两名球员,一名球员会伤害另一名球员。因为我不想使用单例或引用我的游戏管理器类,从玩家内部引用玩家是不可能的,所以我没有对敌人的引用。如果有人知道另一种方法来做这个参考,那也是一个很好的解决方案 因此,我想使用事件并将它们从玩家发送给所有其他玩家。为了检查,如果敌人受到伤害,我使用玩家ID。 我想测试一下听者,我想到的唯一方法就是假装敌人对玩家造成伤害,玩家应该接到一个电话接受伤害。我将不得不用一个假的球员,同时创造他,这似乎有点尴尬,我甚至不知道是否可能C# 如何测试同一类的对象是否接收到事件,c#,unit-testing,events,nsubstitute,C#,Unit Testing,Events,Nsubstitute,我有两名球员,一名球员会伤害另一名球员。因为我不想使用单例或引用我的游戏管理器类,从玩家内部引用玩家是不可能的,所以我没有对敌人的引用。如果有人知道另一种方法来做这个参考,那也是一个很好的解决方案 因此,我想使用事件并将它们从玩家发送给所有其他玩家。为了检查,如果敌人受到伤害,我使用玩家ID。 我想测试一下听者,我想到的唯一方法就是假装敌人对玩家造成伤害,玩家应该接到一个电话接受伤害。我将不得不用一个假的球员,同时创造他,这似乎有点尴尬,我甚至不知道是否可能 [Test] public vo
[Test]
public void ctor_WhenCreated_CallsTakeDamage()
{
Player enemy = Substitute.For<Player>();
BasePlayer player = createPlayer();
enemy.DoDamage += Raise.Event<Action<int,int>>(Arg.Any<int>(),Arg.Any<int>());
//this was my potentially very stupid plan
//player.Received().takeDamage(Arg.Any<int>(),Arg.Any<int>());
}
public class BasePlayer : Player
{
public readonly int playerNumber;
public event Action<int,int> DoDamage;
public BasePlayer()
{
DoDamage += takeDamage;
}
public void takeDamage(int amount,int playerNumber)
{
if(playerNumber != this.playerNumber)
lifeCount-=amount;
}
}
public interface Player
{
void takeDamage(int amount, int playerNumber);
event Action<int, int> DoDamage;
}
[测试]
创建时的公共无效ctor\u CallsTakeDamage()
{
玩家敌人=替换();
BasePlayer=createPlayer();
敌方.DoDamage+=Raise.Event(Arg.Any(),Arg.Any());
//这是我可能非常愚蠢的计划
//player.Received().takeDamage(Arg.Any(),Arg.Any());
}
公共类棒球运动员:运动员
{
公共只读int-playerNumber;
公共事件行动损失;
公共棒球运动员()
{
DoDamage+=损坏;
}
公共无效伤害(整数金额,整数玩家编号)
{
if(playerNumber!=此.playerNumber)
寿命计数-=金额;
}
}
公共接口播放器
{
无效损坏(整数金额,整数玩家编号);
事件行为损害;
}
我现在有一个游戏类,它引用了两个玩家。它用于游戏的一般顺序。我首先尝试通过game类引用对手,但是我需要在玩家的构造函数中引用game类。我认为通过发送事件来分离它们是一个好主意,这样我就不必查看游戏类,但是每当事件被触发时,所有玩家都可以看到事件并承受伤害,如果他们的id被发送的话。但也许这根本不可能。这能回答你的问题吗?欢迎来到StackOverflow!:)从你问题中的例子来看,我不确定这两个参与者是如何联系在一起的。您是否可以添加一些代码,显示一个
玩家将如何影响另一个玩家?(有些东西需要引用这两者来连接事件,在这种情况下,添加Player.doDamage(Player-other,int-amount)
方法可能更容易,尽管您提到Player
不能引用另一个Player
。您能详细说明这个约束吗?)
[Test]
public void ctor_WhenCreated_CallsTakeDamage()
{
Player enemy = Substitute.For<Player>();
BasePlayer player = createPlayer();
enemy.DoDamage += Raise.Event<Action<int,int>>(Arg.Any<int>(),Arg.Any<int>());
//this was my potentially very stupid plan
//player.Received().takeDamage(Arg.Any<int>(),Arg.Any<int>());
}
public class BasePlayer : Player
{
public readonly int playerNumber;
public event Action<int,int> DoDamage;
public BasePlayer()
{
DoDamage += takeDamage;
}
public void takeDamage(int amount,int playerNumber)
{
if(playerNumber != this.playerNumber)
lifeCount-=amount;
}
}
public interface Player
{
void takeDamage(int amount, int playerNumber);
event Action<int, int> DoDamage;
}