Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何测试同一类的对象是否接收到事件_C#_Unit Testing_Events_Nsubstitute - Fatal编程技术网

C# 如何测试同一类的对象是否接收到事件

C# 如何测试同一类的对象是否接收到事件,c#,unit-testing,events,nsubstitute,C#,Unit Testing,Events,Nsubstitute,我有两名球员,一名球员会伤害另一名球员。因为我不想使用单例或引用我的游戏管理器类,从玩家内部引用玩家是不可能的,所以我没有对敌人的引用。如果有人知道另一种方法来做这个参考,那也是一个很好的解决方案 因此,我想使用事件并将它们从玩家发送给所有其他玩家。为了检查,如果敌人受到伤害,我使用玩家ID。 我想测试一下听者,我想到的唯一方法就是假装敌人对玩家造成伤害,玩家应该接到一个电话接受伤害。我将不得不用一个假的球员,同时创造他,这似乎有点尴尬,我甚至不知道是否可能 [Test] public vo

我有两名球员,一名球员会伤害另一名球员。因为我不想使用单例或引用我的游戏管理器类,从玩家内部引用玩家是不可能的,所以我没有对敌人的引用。如果有人知道另一种方法来做这个参考,那也是一个很好的解决方案

因此,我想使用事件并将它们从玩家发送给所有其他玩家。为了检查,如果敌人受到伤害,我使用玩家ID。 我想测试一下听者,我想到的唯一方法就是假装敌人对玩家造成伤害,玩家应该接到一个电话接受伤害。我将不得不用一个假的球员,同时创造他,这似乎有点尴尬,我甚至不知道是否可能

[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;
}