如何对用例进行单元测试

How to take a Use Case to Unit Test

这是我的用例

要开始在 TDD 中编写单元测试,我需要想出 类 和测试方法,例如ClassUnderTest.MethodUnderTest()

名词有:CandidateAdminUserAccountCredentialsPasswordResumeWidget (系统),最后但同样重要的是,SomeOtherAbstractionIDidNotThinkOf(例如 SecurityService)。

动词有:Login()Logout()Register()CreateAccount()RecoverPassword()Unlock()ResetPassword() , Lockout(), 最后但同样重要的是, SomeOtherActionIDidNotThinkOf().

为了让这个问题最简单,让我们看看是否可以坚持Login()。让我看看是否可以为该方法启动单元测试。

你有什么登录方法吗?

如果是这样,您会 Class 放什么?为什么?

如果没有,您会使用什么 Class 和方法?为什么?

我给你一个关于如何开始 TDD 的小提示。首先,考虑如何根据您的用例设计您的软件。(例如:帐户 class 可以包含登录、注销等方法)

[TestFixture]
public class AccountTest
{
   public Account underTest;

   [SetUp]
   public void setUp()
   {
     underTest = new Account();
   }

   [Test]
   public void TestLoginWithValidCredentials()
   { 
      bool isValid = underTest.Login('userName', 'password');         
      Assert.True(isValid );
   }

   [Test]
   public void TestLoginWithInValidCredentials()
   {
       bool isValid = underTest.Login('', '');         
       Assert.False(isValid );
   }

   [Test]
   //Assert Expected Lockout exception here
   public void TestLockoutByPassingInValidCredentialsMoreThan5Times()
   {

       for (int i =0; i< 5; i++)
       {     
          bool isValid = underTest.Login('', '');    
          Assert.False(isValid );     
       }           
        // the system should throw an exception about lockout
        underTest.Login('', ''); 
   }      

   [Test]
   public void TestCreateAccount()
   {
      //Register event can directly call this method
      bool isCreated = underTest.Create(/*User Object*/);
      Assert.True(isCreated );
   }

   [Test]
   public void TestLogout()
   {
      bool success = underTest.Logout('userName');          
      Assert.True(success);          
   }

   [Test]
   public void TestReset()
   {
      // both Unlock and RecoverPassword event can share this method
      bool success = underTest.Reset('userName');          
       // mock the password reset system and return the expected value like 'BSy6485TY'
      Assert.AreEqual('BSy6485TY', password);
   }       
}

更新:添加了更多测试用例以帮助您设计系统。