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

本文关键字:一个 使用 单元测试 Moq 验证 何验证 调用 方法 是否 | 更新日期: 2023-09-27 18:07:06

我想验证一下,当调用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]).

似乎我对。raise调用一个动作而不是一个事件有问题。

有什么建议吗?

编辑

下面是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);
}

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

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