C# 新手,在使用 C# 枚举和强制转换进行计算时遇到问题
New to C#, having trouble with calculations with C# enums and casting
我是 C# 的新手,很难弄清楚为什么我对这个函数的单元测试总是失败。
我有一个枚举(这都是例子,但你明白了要点):
public enum TeamActions
{
TeamWasScoredAgainst = - 10,
TeamScored = 10
}
然后我有一个静态 TeamHelper
class,它通过评估 TeamAction
是否在我的 Team
对象上计算 TeamScore 的 long
正值与否,所以我知道是否要从 运行 TeamScore
总数中添加或减去。
public class Team
{
public long TeamScore {get; set;}
}
public static long CalcNewTeamScore(Team team, TeamActions teamAction)
{
if (team == null) throw new ArgumentNullException("Team is null");
if ((int)teamAction < 1)
{
return team.TeamScore - Convert.ToInt64((int)teamAction);
}
else
{
return team.TeamScore + Convert.ToInt64((int)teamAction);
}
}
我的 xUnit
测试失败了:
public void TeamWasScoredAgainst_ShouldDecreaseScore()
{
// arrange
var teamUnderTest = new Team
{
TeamScore = 100
};
// act
teamUnderTest.TeamScore = TeamHelper.CalcNewTeamScore(teamUnderTest, TeamAction.TeamWasScoredAgainst);
// assert
Assert.Equal(90, teamUnderTest.TeamScore);
}
我真的不确定我的测试是否错误(第一次做),或者 TeamHelper 方法转换错误,或者数学本身是错误的。有帮助吗?
你的数学错了。
由于您的枚举值本身已经是负数,从其他东西中减去它,实际上会增加结果。
你应该改变
public static long CalcNewTeamScore(Team team, TeamActions teamAction)
{
if (team == null) throw new ArgumentNullException("Team is null");
if ((int)teamAction < 1)
{
// Convert.ToInt64((int)teamAction) = -10
// you actually have 100 - (-10) => 110
return team.TeamScore - Convert.ToInt64((int)teamAction);
}
else
{
return team.TeamScore + Convert.ToInt64((int)teamAction);
}
}
到
public static long CalcNewTeamScore(Team team, TeamActions teamAction)
{
if (team == null) throw new ArgumentNullException("Team is null");
return team.TeamScore + Convert.ToInt64((int)teamAction);
}
你的代码中的问题是 teamAction
可以是负数,你减去负值。如果你从一个数字中减去一个负值,结果会比你减去的数字大。
显示问题的较短示例:
var negativeValue = -10;
var result = 10 - negativeValue;
Assert.Equal(20, result);
这就像现实世界中的数学一样。
x = 10 - (-10)
x = 10 + 10
x = 20
您的代码完全按照您编程的方式执行。
如果我猜的话,我会说你想在你的球队输球时减去 10。
但是您所做的是添加这个额外的 if
以确保当枚举为 negative 时,它会 subtracted.但是如果你从某物中减去“-10”,你实际上是在加 10。
“X - (-10)”是“X + 10”。
所以您可能希望将此 if
全部删除并始终添加枚举值。当枚举值为 -10 时,将减去 10。
我是 C# 的新手,很难弄清楚为什么我对这个函数的单元测试总是失败。
我有一个枚举(这都是例子,但你明白了要点):
public enum TeamActions
{
TeamWasScoredAgainst = - 10,
TeamScored = 10
}
然后我有一个静态 TeamHelper
class,它通过评估 TeamAction
是否在我的 Team
对象上计算 TeamScore 的 long
正值与否,所以我知道是否要从 运行 TeamScore
总数中添加或减去。
public class Team
{
public long TeamScore {get; set;}
}
public static long CalcNewTeamScore(Team team, TeamActions teamAction)
{
if (team == null) throw new ArgumentNullException("Team is null");
if ((int)teamAction < 1)
{
return team.TeamScore - Convert.ToInt64((int)teamAction);
}
else
{
return team.TeamScore + Convert.ToInt64((int)teamAction);
}
}
我的 xUnit
测试失败了:
public void TeamWasScoredAgainst_ShouldDecreaseScore()
{
// arrange
var teamUnderTest = new Team
{
TeamScore = 100
};
// act
teamUnderTest.TeamScore = TeamHelper.CalcNewTeamScore(teamUnderTest, TeamAction.TeamWasScoredAgainst);
// assert
Assert.Equal(90, teamUnderTest.TeamScore);
}
我真的不确定我的测试是否错误(第一次做),或者 TeamHelper 方法转换错误,或者数学本身是错误的。有帮助吗?
你的数学错了。
由于您的枚举值本身已经是负数,从其他东西中减去它,实际上会增加结果。
你应该改变
public static long CalcNewTeamScore(Team team, TeamActions teamAction)
{
if (team == null) throw new ArgumentNullException("Team is null");
if ((int)teamAction < 1)
{
// Convert.ToInt64((int)teamAction) = -10
// you actually have 100 - (-10) => 110
return team.TeamScore - Convert.ToInt64((int)teamAction);
}
else
{
return team.TeamScore + Convert.ToInt64((int)teamAction);
}
}
到
public static long CalcNewTeamScore(Team team, TeamActions teamAction)
{
if (team == null) throw new ArgumentNullException("Team is null");
return team.TeamScore + Convert.ToInt64((int)teamAction);
}
你的代码中的问题是 teamAction
可以是负数,你减去负值。如果你从一个数字中减去一个负值,结果会比你减去的数字大。
显示问题的较短示例:
var negativeValue = -10;
var result = 10 - negativeValue;
Assert.Equal(20, result);
这就像现实世界中的数学一样。
x = 10 - (-10)
x = 10 + 10
x = 20
您的代码完全按照您编程的方式执行。
如果我猜的话,我会说你想在你的球队输球时减去 10。
但是您所做的是添加这个额外的 if
以确保当枚举为 negative 时,它会 subtracted.但是如果你从某物中减去“-10”,你实际上是在加 10。
“X - (-10)”是“X + 10”。
所以您可能希望将此 if
全部删除并始终添加枚举值。当枚举值为 -10 时,将减去 10。