验证在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
。这可能吗?
这可以通过将属性行为附加到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应该保持不变