单元测试 - 在测试中将枚举作为方法参数传递 Class
Unit Testing - Passing enum as method parameters in Test Class
我有一个 class 游戏。我想知道在这种情况下将游戏 class 中的枚举作为方法
中的参数传递给测试 class 的最佳做法是什么
游戏 class 有以下内容:
public enum Result
{
Zero,
One,
etc...
}
public int ResultCount(Result result)
{
switch(result)
{
case Result.Zero
return 0;
case Result.One
retun 1;
etc...
}
}
public void CurrentResult(Result hometeam, Result awayteam)
{
setHomeTeamGoals(hometeam);
setAwayTeamGoals(awayteam);
}
然后我有一个单元测试class,我想在设置中设置结果
[TestFixture]
public class Result_is_1_1
{
private Game _game;
[SetUp]
public void SetUp()
{
_game = new Game();
_game.CurrentResult(Result.One, Result.One);
}
当我使用以下内容时有效
using static unitTest.Game;
但我不确定这是否是不好的做法/快速修复等
推荐的方法是什么?
是的,对您的 class 测试使用静态通常是一种表明测试设计不佳的气味。如果你想让你的测试是独立的,就像单元测试的通常做法一样,通过在你的 SetUp 方法中实例化它来为每个测试创建一个新游戏 - 就像你现在所做的那样。
如果您想在同一个游戏中按顺序执行多个步骤,通常的方法是在测试本身中执行这些步骤。
如果您希望每个测试方法实际上成为一个按特定顺序执行的步骤,那么您就偏离了通常认为的unit 测试并进行不同类型的测试。您也正在远离 NUnit 最擅长的领域。
但是,如果你真的想要,你可以在 [OneTimeSetUp]
方法中创建你的游戏,并按顺序使用 OrderAttribute
对所有测试进行排序按顺序 运行 它们。这会使您的测试有些脆弱,因为每个测试都依赖于它之前 运行 的所有测试。
很难回答您的问题,因为您没有提供 complete/working 代码。但我猜你将 Result
定义为 Game
class 中的嵌套枚举,这引起了一些混乱。
所以我假设你的 Game
class 看起来像这样:
public class Game
{
public enum Result
{
Zero,
One,
}
// Other methods...
}
假设是这种情况,您的枚举的全名是 Game.Result
,因为 Result
是在 Game
.
中定义的
因此,当您想从单元测试(或任何其他 class,就此而言)引用 Result
枚举时,您有两个选择。
选项 1,参考 Game.Result
(不需要 using static
):
_game.CurrentResult(Game.Result.One, Game.Result.One);
选项 2,像您所做的那样使用 using static
语句:
using static unitTest.Game;
// ...
_game.CurrentResult(Result.One, Result.One);
(额外的第三个选项,您可以在 Game
class 之外定义 Result
枚举。那么您无需担心选项 1 或 2。)
假设我正确理解了你的问题,那么这不是一个糟糕的测试实践。事实上,它与测试根本没有任何关系。这只是一种语言功能。就个人而言,我更喜欢使用全名 Game.Result
,而不是使用 using static
语句。
我有一个 class 游戏。我想知道在这种情况下将游戏 class 中的枚举作为方法
中的参数传递给测试 class 的最佳做法是什么游戏 class 有以下内容:
public enum Result
{
Zero,
One,
etc...
}
public int ResultCount(Result result)
{
switch(result)
{
case Result.Zero
return 0;
case Result.One
retun 1;
etc...
}
}
public void CurrentResult(Result hometeam, Result awayteam)
{
setHomeTeamGoals(hometeam);
setAwayTeamGoals(awayteam);
}
然后我有一个单元测试class,我想在设置中设置结果
[TestFixture]
public class Result_is_1_1
{
private Game _game;
[SetUp]
public void SetUp()
{
_game = new Game();
_game.CurrentResult(Result.One, Result.One);
}
当我使用以下内容时有效
using static unitTest.Game;
但我不确定这是否是不好的做法/快速修复等
推荐的方法是什么?
是的,对您的 class 测试使用静态通常是一种表明测试设计不佳的气味。如果你想让你的测试是独立的,就像单元测试的通常做法一样,通过在你的 SetUp 方法中实例化它来为每个测试创建一个新游戏 - 就像你现在所做的那样。
如果您想在同一个游戏中按顺序执行多个步骤,通常的方法是在测试本身中执行这些步骤。
如果您希望每个测试方法实际上成为一个按特定顺序执行的步骤,那么您就偏离了通常认为的unit 测试并进行不同类型的测试。您也正在远离 NUnit 最擅长的领域。
但是,如果你真的想要,你可以在 [OneTimeSetUp]
方法中创建你的游戏,并按顺序使用 OrderAttribute
对所有测试进行排序按顺序 运行 它们。这会使您的测试有些脆弱,因为每个测试都依赖于它之前 运行 的所有测试。
很难回答您的问题,因为您没有提供 complete/working 代码。但我猜你将 Result
定义为 Game
class 中的嵌套枚举,这引起了一些混乱。
所以我假设你的 Game
class 看起来像这样:
public class Game
{
public enum Result
{
Zero,
One,
}
// Other methods...
}
假设是这种情况,您的枚举的全名是 Game.Result
,因为 Result
是在 Game
.
因此,当您想从单元测试(或任何其他 class,就此而言)引用 Result
枚举时,您有两个选择。
选项 1,参考 Game.Result
(不需要 using static
):
_game.CurrentResult(Game.Result.One, Game.Result.One);
选项 2,像您所做的那样使用 using static
语句:
using static unitTest.Game;
// ...
_game.CurrentResult(Result.One, Result.One);
(额外的第三个选项,您可以在 Game
class 之外定义 Result
枚举。那么您无需担心选项 1 或 2。)
假设我正确理解了你的问题,那么这不是一个糟糕的测试实践。事实上,它与测试根本没有任何关系。这只是一种语言功能。就个人而言,我更喜欢使用全名 Game.Result
,而不是使用 using static
语句。