C# 单元测试的文件范围

C# 单元测试的文件范围,c#,unit-testing,C#,Unit Testing,我有一个类Stats,里面有一些方法。比如: public int getamountoftimesplayerlogedin(字符串playerName) public int getHighestScoreInLeague(字符串联盟名称) public int-getTopPlayers(字符串leagueName,int-topfresults) 当我为这个类创建单元测试时,我是否必须为这个类中的每个方法创建一个单独的.cs文件 因为我很难命名我的单元测试方法。我喜欢WhenXXX\u

我有一个类
Stats
,里面有一些方法。比如:

public int getamountoftimesplayerlogedin(字符串playerName)

public int getHighestScoreInLeague(字符串联盟名称)

public int-getTopPlayers(字符串leagueName,int-topfresults)

当我为这个类创建单元测试时,我是否必须为这个类中的每个方法创建一个单独的
.cs
文件

因为我很难命名我的单元测试方法。我喜欢WhenXXX\u ThenYYY命名约定。但是如果我有一个
.cs
文件,它涵盖了
Stats
的所有方法测试,那么您如何真正知道它正在测试什么方法呢

我的意思是,假设我想测试
getTopPlayers
。然后我将创建一个测试方法,如:

WhenLeageNameIsTest\u Expect20

但是,您如何通过查看该名称来判断测试了什么方法。。?可以是
getHighestScoreInLeague
getTopPlayers

那么,我是否应该在一个单独的
.cs
文件中分离方法的每个测试?或者我应该改变我的命名约定,或者其他什么

编辑 我刚想到这一点。在一个测试方法中进行多个
断言可以吗

但是你怎么能通过看这个名字来判断测试的是什么方法呢。。。我应该改变我的命名约定吗

一个流行的惯例是在表单中命名您的测试方法

 MethodUnderTest_Scenario_Expectation()
对你来说,如果使用这个表格

 public void getHighestScoreInLeague_LeagueNameIsTest_Returns20()
这也是Roy Osherove在年推荐的一种形式。它可以让你一目了然,知道什么是正在测试和什么是预期的。你的名字在大多数情况下都是这样的,添加方法名以保持清晰

通常建议每个测试类有一个测试文件。如果您有很多正在测试的方法,并且有很多很多测试来涵盖这些方法的行为,那么这可能是一个评估您的设计的机会。你们班做得太多了吗?这并不是说答案马上就是“是的”,这只是一个可能需要考虑片刻的想法。当你把你的类放在一个单一的职责上时,你的测试(和测试文件)自然也会变小


我刚想到这一点。在一个测试方法中进行多个断言可以吗

理想情况下,答案是否定的。您希望测试失败的原因只有一个。当您有多个断言时,您有多个失败原因。如果早期断言失败,则后续断言不会运行。尽可能隔离您的资产

您的单元测试应该从山顶尖叫出具体的场景和期望(通过名称)以及出错的地方(通过单个断言)。您不需要启动调试器来找出单元测试失败的地方,尽管这并非总是可以避免的

但是你怎么能通过看这个名字来判断测试的是什么方法呢。。。我应该改变我的命名约定吗

一个流行的惯例是在表单中命名您的测试方法

 MethodUnderTest_Scenario_Expectation()
对你来说,如果使用这个表格

 public void getHighestScoreInLeague_LeagueNameIsTest_Returns20()
这也是Roy Osherove在年推荐的一种形式。它可以让你一目了然,知道什么是正在测试和什么是预期的。你的名字在大多数情况下都是这样的,添加方法名以保持清晰

通常建议每个测试类有一个测试文件。如果您有很多正在测试的方法,并且有很多很多测试来涵盖这些方法的行为,那么这可能是一个评估您的设计的机会。你们班做得太多了吗?这并不是说答案马上就是“是的”,这只是一个可能需要考虑片刻的想法。当你把你的类放在一个单一的职责上时,你的测试(和测试文件)自然也会变小


我刚想到这一点。在一个测试方法中进行多个断言可以吗

理想情况下,答案是否定的。您希望测试失败的原因只有一个。当您有多个断言时,您有多个失败原因。如果早期断言失败,则后续断言不会运行。尽可能隔离您的资产


您的单元测试应该从山顶尖叫出具体的场景和期望(通过名称)以及出错的地方(通过单个断言)。您不必启动调试器来找出单元测试失败的地方,尽管这并非总是可以避免的。

这里介绍了一种很好的结构:

基本上,SUT中的每个方法在fixture中都有自己的嵌套类,那么该方法的每个测试都是testmethod。当它们组合在一起时,几乎可以作为一个句子来阅读,例如
TheTitleizerMethod.ReturnsDefaultTitleForNullName()
。链接中的代码示例:

public class TitleizerFacts
{
    public class TheTitleizerMethod
    {
        [Fact]
        public void ReturnsDefaultTitleForNullName()
        {
            // Test code
        }

        [Fact]
        public void AppendsTitleToName()
        {
            // Test code
        }
    }

    public class TheKnightifyMethod
    {
        [Fact]
        public void ReturnsDefaultTitleForNullName()
        {
            // Test code
        }

        [Fact]
        public void AppendsSirToMaleNames()
        {
            // Test code
        }

        [Fact]
        public void AppendsDameToFemaleNames()
        {
            // Test code
        }
    }
}

这里描述了一个很好的结构:

基本上,SUT中的每个方法在fixture中都有自己的嵌套类,那么该方法的每个测试都是testmethod。当它们组合在一起时,几乎可以作为一个句子来阅读,例如
TheTitleizerMethod.ReturnsDefaultTitleForNullName()
。链接中的代码示例:

public class TitleizerFacts
{
    public class TheTitleizerMethod
    {
        [Fact]
        public void ReturnsDefaultTitleForNullName()
        {
            // Test code
        }

        [Fact]
        public void AppendsTitleToName()
        {
            // Test code
        }
    }

    public class TheKnightifyMethod
    {
        [Fact]
        public void ReturnsDefaultTitleForNullName()
        {
            // Test code
        }

        [Fact]
        public void AppendsSirToMaleNames()
        {
            // Test code
        }

        [Fact]
        public void AppendsDameToFemaleNames()
        {
            // Test code
        }
    }
}

您对多个资产的编辑是一个单独的问题,以前曾被问过(您对多个资产的编辑是一个单独的问题,以前被问过)(我可以将该类的所有测试放在同一个
.cs
文件中吗?或者您建议将每个方法的测试分开吗?我的测试方法中可以有多个
断言吗?(请参见编辑)更新了我的答案。但一般来说,是的,将其保存在一个文件中,否,避免多个断言。我可以将该类的所有测试放在同一个
.cs
文件中吗?或者您建议将每个方法的测试分开吗?我的测试方法中可以有多个
断言吗?(请参见编辑)更新了我的答案。但一般来说,是的,保留在一个文件中,不是的,避免多个asser