验证在Action代理中执行的代码

时间:2013-01-21 04:24:15

标签: c# unit-testing moq

这是界面:

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。这可能吗?

1 个答案:

答案 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应该保留属性设置器/获取器。