【问题标题】:NUnit - Unit Test - Dispose issueNUnit - 单元测试 - 处理问题
【发布时间】:2021-04-08 22:06:30
【问题描述】:
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# .net visual-studio unit-testing nunit


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢您!完美运行并解决了问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
相关资源
最近更新 更多