c# - 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 但它不起作用或者我执行错误?
解决方案
使用 NUnit 时,会创建一个夹具实例并将其用于夹具中的所有测试。因此,任何需要初始化的状态都应该SetUp
在每次测试之前运行的方法中处理。
您没有显示您的方法的代码,GivenTheScoreIs
但听起来它应该初始化分数。为确保其正常工作,请添加一个测试以验证分数是否已设置 (0:0)。
以上应该工作。但是,我建议更进一步,不要继承自SoccerGame
,这可能是您正在测试的类。虽然以这种方式继承测试有时很有用,但这不是正常或最干净的方式。最好将被测系统与测试本身分开。
为此,我建议您SoccerGame
在方法中为每个测试实例化一个新的SetUp
。这将消除状态从一个测试转移到另一个测试的任何可能性,因为每个测试都将使用一个新的SoccerGame
.
推荐阅读
- powerbi - 在 Power Bi 中反透视数据并分离整数和字符串
- unity3d - Hololens Spectator View Android 空间故障
- c# - 尝试序列化 JSON 数组时获取异常 Newtonsoft.Json.JsonSerializationException
- ruby-on-rails - 来自嵌套模块的 Rspec“NoMethodError”
- python - 计算数据框中与另一个实例匹配的实例
- blockchain - 尝试使用 SunPKCS11 提供程序将 Corda R3 区块链与 Utimaco HSM 集成
- navigation - 导航搜索栏
- typescript - 将类型的字段列表映射到数组类型
- ios - 如何在 Swift 中使用 place_id 从 Google Places API 请求地点详细信息?
- java - 为什么要使用 awt.Dimension 类?