验证在Action委托中执行的代码

本文关键字:执行 代码 Action 验证 | 更新日期: 2023-09-27 17:54:37

界面如下:

public interface IFacebookChatClient
{
    Action OnLogin { get; set; }
    bool Login(string apiKey, string accessToken);
    void SendMessage(string message, string receiverId);
    void Close();
}

下面是一个示例用法:

client.Login("...", "...");
client.OnLogin = () =>
{
    client.SendMessage("Testing", "Hello World!");
    client.Close();
}; 

在单元测试中,我想验证使用特定值调用SendMessage。这可能吗?

验证在Action委托中执行的代码

这可以通过将属性行为附加到OnLogin属性:

var mock = new Mock<IFacebookChatClient>();
// Tell mock to treat OnLogin as regular property
// Second parameter is initial value (doesn't matter in your case)
mock.SetupProperty(m => m.OnLogin, () => { });
// perform test
mock.Verify(m => m.SendMessage("Testing", "Hello World!"));

通常,尝试调用属性getter会导致NullReferenceException,除非SetupGet作为模拟初始化的一部分被调用。这里的问题是,我们不想从getter返回固定值,因为它是由测试代码设置的。我们需要财产作为财产,而不需要Moq的阻碍。这就是SetupProperty所做的——告诉Moq属性setter/getter应该保持不变