如何验证调用方法时是否引发了操作(使用 Moq 进行单元测试)

How do I verify that an action is raised when calling a method (unit testing with Moq)

我想验证调用 AuthenticateUserAsync()(具有 return 类型的 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 setup

的回调中调用它
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)));