改进嘲弄代表

本文关键字:嘲弄 | 更新日期: 2023-09-27 18:06:53

我使用Rhino mock。我有一个数据存储库,它的一小部分是这样定义的,

interface IDataRepository
{
    void GetCurrentUserId(Action<int?> callback);
}

这是在silverlight RIA服务应用程序的客户端,因此我们有一个Action回调。一旦操作在服务器上完成,并且有一个结果,这个函数就会回调。

要对调用那个方法的东西进行单元测试,我最终会这样做,

private delegate void GetCurrentUserIdDelegate(Action<int?> callback);
private void GetCurrentUserId(Action<int?> callback)
{
    callback.Invoke(10);
}
[TestMethod]
public void TestBlah()
{
    var mockRepository = MockRepository.GenerateMock<IDataRepository>();
    mockRepository.Expect(r => r.GetCurrentUserId(null)).IgnoreArguments().Do(new GetCurrentUserIdDelegate(GetCurrentUserId));
}

它工作得很好,但是看起来很啰嗦。没有更简洁的方法吗?

我将不得不为IDataRepository接口中具有回调的每个方法定义一个委托。对我来说,这看起来有点乱,很难维护,等等。

也许有一个内联的方式来做,而不需要定义委托?

改进嘲弄代表

您传递的委托应该具有与模拟方法相同的签名,因此在您的情况下,您可以使用Action<Action<int?>>:

mockRepository
    .Expect(r => r.GetCurrentUserId(null))
    .IgnoreArguments()
    .Do(new Action<Action<int?>>(act => { act(10); }));