这是界面:
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
。这可能吗?
答案 0 :(得分:1)
这可以通过将属性行为附加到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应该保留属性设置器/获取器。