我想验证在调用AuthenticateUserAsync()(返回类型为void)时是否引发了适当的操作。

这是我目前的做法:

var mock = new Mock<ILoginPresenter>();
mock.Setup(x => x.AuthenticateUserAsync(username, password))
    .Raises(x => x.UserPassesAuthentication += null, new LoginEventArgs(thing));


问题是运行此测试时,出现错误:

Could not locate event for attach or detach method Void set_UserPassesAuthentication(System.Action`1[Common.View.LoginEventArgs]).


似乎我遇到了问题。.Raises调用操作而不是事件。

有什么建议么?

编辑

这是ILoginPresenter的定义:

public interface ILoginPresenter
{
    Action<LoginEventArgs> UserPassesAuthentication { get; set; }
    Action UserFailedAuthentication { get; set; }
    void AuthenticateUserAsync(string user, string password);
    bool IsLoginFabVisible(int userTextCount, int passwordTextCount);
}

最佳答案

.Raises用于事件。您正在尝试使用Action<T>调用它,但该命令不起作用。您需要模拟操作并在AuthenticateUserAsync设置中回叫它

Action<LoginEventArgs> handler = args => {
    //...action code;
};

var mock = new Mock<ILoginPresenter>();
mock.Setup(x => x.UserPassesAuthentication(It.IsAny<Action<LoginEventArgs>Action<LoginEventArgs>>()))
    .Returns(handler);
mock.Setup(x => x.AuthenticateUserAsync(username, password))
    .Callback(handler(new LoginEventArgs(thing)));

关于c# - 如何在调用方法时验证是否引发了操作(使用Moq进行单元测试),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39517397/

10-17 01:54