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
.
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
.