NUnit - 单元测试 - 处理问题

NUnit - Unit Test - Dispose issue

namespace Game.SoccerGame

 [TestFixture]
    public class Score_is_0_0 : SoccerGame
    {
        [SetUp]
        public void SetUp()
        {
            GivenTheScoreIs(0,0);
        }

  [TearDown]
        public void CleanUp()
        {
           

        }

        [Test]
        public void When_Team1_Scores()
        {
            WhenTeam1Scores();

            Assert.That(ScoreOutput, Is.EqualTo("1:0"));
        }

        [Test]
        public void When_Team2_Scores()
        {
            WhenTeam2Scores();

            Assert.That(ScoreOutput, Is.EqualTo("0:1"));
        }
    }

Expected:
When_Team1_Scores() = 1:0
When_Team1_Scores() = 0:1

当我 运行 单独测试时,它们按预期工作。 我遇到的问题是我同时 运行 class 中的测试。当我这样做时,结果是:

When_Team1_Scores() = 1:0
When_Team1_Scores() = 1:1

ScoreOutput 在第一次测试后保持其状态,因此我的第二次测试失败

在 TearDown 中杀死中间状态的最佳方法是什么?

我在一个单独的 class SoccerGame 中有下面的对象,我继承它控制得分状态


public abstract class SoccerGame : IDisposable
private SetScore currentScore = new SetScore();

 protected string ScoreOutput => currentScore.ToString();

 public void Dispose()
        {
          
        }

我尝试使用 IDisposable,但它不起作用或者我实施错误?

使用 NUnit 时,会创建固定装置的单个实例并将其用于固定装置中的所有测试。因此,任何需要初始化的状态都应该在 SetUp 方法中处理,该方法在每次测试之前运行。

您没有显示您的方法的代码 GivenTheScoreIs,但听起来它应该初始化乐谱。为确保它正常工作,添加一个测试来验证分数是否设置为 (0:0)。

以上应该有效。但是,我建议更进一步,不要继承 SoccerGame,这可能是您正在测试的 class。虽然以这种方式继承测试偶尔会有用,但这不是正常或最干净的方式。最好将被测系统与测试本身分开。

为此,我建议您在 SetUp 方法中为每个测试实例化一个新的 SoccerGame。这将消除状态从一个测试转移到另一个测试的任何可能性,因为每个测试都将使用新的 SoccerGame.