2016-09-15 48 views
0

我想验证何时调用AuthenticateUserAsync()(它具有void的返回类型),以引发相应的操作。如何在调用方法时验证是否引发了操作(使用Moq进行单元测试)

这里我目前的做法:

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

回你可以显示'ILoginPresenter' – Nkosi

+0

@Nkosi代码定义发布 – kformeck

+0

'.Raises'用于事件。你试图用一个不起作用的动作来调用它。您需要模拟该操作并在来自'AuthenticateUserAsync'设置的回调中调用它 – Nkosi

回答

1

.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))); 
相关问题