首页 > 解决方案 > NUnit - 单元测试 - 处理问题

问题描述

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

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

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

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

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

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


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

 protected string ScoreOutput => currentScore.ToString();

 public void Dispose()
        {
          
        }

我尝试使用 IDisposable 但它不起作用或者我执行错误?

标签: c#.netvisual-studiounit-testingnunit

解决方案


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

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

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

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


推荐阅读