【发布时间】:2017-11-27 10:26:42
【问题描述】:
所以我正在创建一个 Snake 游戏并想测试“Snake-food”在“吃掉”时是否会更改 Position。
所以我有一个简单的 Position-class,看起来有点像这样:
public class Position
{
public int XCoordinate {get; set;}
public int YCoordinate {get; set;}
public Position(int x, int y)
{
XCoordinate = x;
YCoordinate = y;
}
}
在测试中,我想看到食物的位置在被吃掉时会更新。因为似乎没有比较对象的好方法,所以我用 Assert 来做这个(简化的方法):
[Test]
public void AssertFoodSpawnsOnNewLocationWhenEaten()
{
int expectedX = _sut.Food.Pos.XCoordinate;
int expectedY = _sut.Food.Pos.YCoordinate;
_sut.FeedSnake();
int resultX = _sut.Food.Pos.XCoordinate;
int resultY = _sut.Food.Pos.YCoordinate;
Assert.AreNotEqual(expectedX, resultX);
Assert.AreNotEqual(expectedY, resultY);
}
意识到我的解决方案是一个糟糕的解决方案,因为 Food-Position 可能已经更新甚至很难,例如expectedX 和 resultX 相等。
有没有人告诉我如何测试这个?你能做一些Assert.AreNotEqual检查x坐标和y坐标是否不相等吗?
感谢您的帮助!
【问题讨论】:
-
“因为似乎没有比较对象的好方法”当然,是之一:在您的
Position类中覆盖Equals和GetHashCode。这使您能够使用Assert.AreEqual(expected, myInstanceOfPosition)。除此之外,我们不知道如何测试某些东西,即使expectedX和resultX相等,它也可能会改变。 -
抱歉,我可能不清楚。 Food-object 获得一个随机生成的位置。我的意思是食物对象的新位置仍然可以具有相同的 x 坐标,但 y 坐标可能不同。
-
@HimBromBeere 你能举一个比较对象的例子吗?
-
好吧,如果我理解正确的话,你已经确定你的会员不能正常工作,所以你的测试对我来说似乎有点过时了,因为它没有透露任何消息。那么你的问题到底是什么?创建没有重复位置的随机数?
-
@Jesper 这看起来像是一个设计问题。您可能需要重新考虑如何设计职位。
标签: c# unit-testing nunit tdd