单元测试 - 在测试中将枚举作为方法参数传递 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 语句。