Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查是否引发了事件_C#_Unit Testing_Events_Nunit_Moq - Fatal编程技术网

C# 检查是否引发了事件

C# 检查是否引发了事件,c#,unit-testing,events,nunit,moq,C#,Unit Testing,Events,Nunit,Moq,如果传递的凭据正常,则在通过数据库按下窗口登录Windows Loger chcecks中的按钮后,我正在编写应用程序。如果它返回非null的内容,我想检查loger.validateuser是否引发LoginSucces事件。如何测试它 namespace Komora.Classes.Loger { public abstract class Loger { public delegate void LoginStatus(object sender, EventArgs e);

如果传递的凭据正常,则在通过数据库按下窗口登录Windows Loger chcecks中的按钮后,我正在编写应用程序。如果它返回非null的内容,我想检查loger.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");

    }
}

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

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);            
    }
}

进行两次测试,一次为“成功”,一次为“失败”

[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);
    }   
}