【问题标题】:Check if event was raised检查是否引发了事件
【发布时间】:2014-12-10 09:37:06
【问题描述】:

我正在编写一个应用程序,在按下窗口中的按钮后,LoginWindow Loger 会通过数据库进行检查,如果传递的凭据正常。如果它返回一些东西(非空),我想检查 logger.validateuser() 是否引发了 LoginSucces 事件。如何测试?

namespace Komora.Classes.Loger
{
public abstract class Loger
{

    public delegate void LoginStatus(object sender, EventArgs e);
    public event LoginStatus loginSucces;
    public event LoginStatus loginFailed;

    public abstract void validateUser(string login, string password) ;

    protected void RaiseLoginSuccesEvent(EventArgs eventArgs)
    {
        if (loginSucces != null)
        {
            loginSucces(this, eventArgs);
        }
    }

    protected void RaiseLoginFailedEvent(EventArgs eventArgs)
    {
        if (loginFailed != null)
        {
            loginFailed(this, eventArgs);
        }
    }
}
}

namespace Komora.Classes.Loger
{
public class LogerDataBase : Loger
{
    #region Private Variables
    DataBase.IDataBaseConncection dataBaseConnection;
    #endregion

    #region Constructor
    public LogerDataBase(DataBase.IDataBaseConncection dataBaseConnection)
    {
        this.dataBaseConnection = dataBaseConnection;
    }
    #endregion

    #region Derived Methods
    public override void validateUser(string login, string password)
    {
        if (LogInSuccess(login, password))
        {
            RaiseLoginSuccesEvent(EventArgs.Empty);
        }
        else
        {
            RaiseLoginFailedEvent(EventArgs.Empty);
        }
    }
    #endregion

    #region Private Methods
    private bool LogInSuccess(string login, string password)
    {
        if (null != dataBaseConnection.getUserByCredentials(login, password))
            return true;
        else
            return false;
    }
    #endregion

}
}

public class LogerDataBaseTests
{
    [TestCase]
    public void ValidateUserCalledWithGoodUserCredentialsRaisesLoginSuccesEventShouldPass()
    {
        var dataBaseConnectionMock = new Mock<Classes.DataBase.IDataBaseConncection>();
        dataBaseConnectionMock.Setup(m => m.getUserByCredentials(It.IsAny<string>(), It.IsAny<string>())).Returns(new object());

        var loger = new Classes.Loger.LogerDataBase(dataBaseConnectionMock.Object);
        loger.validateUser("user", "pass");

    }
}

【问题讨论】:

    标签: c# unit-testing events nunit moq


    【解决方案1】:

    只需将您的测试订阅到该事件并检查它是否已引发:

    public class LogerDataBaseTests
    {
        [TestCase]
        public void ValidateUserCalledWithGoodUserCredentialsRaisesLoginSuccesEventShouldPass()
        {
            var dataBaseConnectionMock = new Mock<Classes.DataBase.IDataBaseConncection>();
            dataBaseConnectionMock.Setup(m => m.getUserByCredentials(It.IsAny<string>(), It.IsAny<string>())).Returns(new object());
    
            var loger = new Classes.Loger.LogerDataBase(dataBaseConnectionMock.Object);
    
            bool successRaised = false;
            bool failureRaised = false;
            loginSucces += (s, e) => {successRaised = true;}
            loginFailed += (s, e) => {failureRaised = true;}
    
            loger.validateUser("user", "pass");
    
            Assert.IsTrue(successRaised);
            Assert.IsFalse(failureRaised);            
        }
    }
    

    【讨论】:

      【解决方案2】:

      进行两项测试,一项代表“成功”,一项代表“失败”。

      [TestClass]
      public class LogerDataTest
      {
          [TestMethod]
          public void validateUser_getUserByCredentialsReturnsNotNull_loginSuccesEventIsRaised()
          {
              // Arrange
              const int loginSuccesExpected = 1;
              int loginSuccesActual = 0;
              Mock<DataBase.IDataBaseConncection> dataConnectionStub = new Mock<DataBase.IDataBaseConncection>();
              dataConnectionStub.Setup(db => db.getUserByCredentials("loginFake", "passwordFake")).Returns("User");
              LogerDataBase logerData = new LogerDataBase(dataConnectionStub.Object);
              logerData.loginSucces += (sender, args) =>
              {
                  loginSuccesActual++;
              };
      
              // Act
              logerData.validateUser("loginFake", "passwordFake");
      
              // Assert
              Assert.AreEqual(loginSuccesExpected, loginSuccesActual);
          }
      
          [TestMethod]
          public void validateUser_getUserByCredentialsReturnsNull_loginFailedEventIsRaised()
          {
              // Arrange
              const int loginFailedExpected = 1;
              int loginFailedActual = 0;
              Mock<DataBase.IDataBaseConncection> dataConnectionStub = new Mock<DataBase.IDataBaseConncection>();
              dataConnectionStub.Setup(db => db.getUserByCredentials("loginFake", "passwordFake")).Returns(null);
              LogerDataBase logerData = new LogerDataBase(dataConnectionStub.Object);
              logerData.loginFailed += (sender, args) =>
              {
                  loginFailedActual++;
              };
      
              // Act
              logerData.validateUser("loginFake", "passwordFake");
      
              // Assert
              Assert.AreEqual(loginFailedExpected, loginFailedActual);
          }   
      }
      

      【讨论】:

        猜你喜欢
        • 2019-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-31
        相关资源
        最近更新 更多