【问题标题】:Mocking InvokeOperation for Unit Testing using Rhino Mocks使用 Rhino Mocks 模拟 InvokeOperation 进行单元测试
【发布时间】:2011-07-13 20:22:07
【问题描述】:

我有一个带有方法的数据服务接口:

   void GetDataByLocationId(Guid locationId, Action<InvokeOperation<IEnumerable<DataValue>>> callback);

我想测试一个依赖于这个数据服务接口的类,并且想模拟出上面的方法。

我将我的模拟设置为:

_mocks = new MockRepository();

    var dataLoadOperation = _mocks.StrictMock<InvokeOperation<IEnumerable<DataValue>>>();
    Action<InvokeOperation<IEnumerable<DataValue>>> dataValueCallback = null;

然后在我的测试执行中:

    var locationId = Guid.NewGuid();
    var values = // something //
    using (_mocks.Unordered())
    {
            Expect.Call(() => _dataService.GetDataByLocationId(Arg<Guid>.Is.Equal(locationId), Arg<Action<InvokeOperation<IEnumerable<DataValue>>>>.Is.Anything));
            LastCall.Callback(new Func<Action<InvokeOperation<IEnumerable<DataValue>>>, bool>(c => { dataValueCallback = c; return true; }));
            dataLoadOperation .Stub(x => x.HasError).Return(false);
            dataLoadOperation .Stub(x => x.Value).Return(values);
    }

但它永远不会执行......结果证明:

System.ServiceModel.DomainServices.Client.InvokeOperation

是一个密封类,Rhino Mocks在运行时会抛出异常

无法创建密封类的模拟

我正在寻找有关改进我的设计以支持此测试用例的建议;并且仍在使用模拟。

【问题讨论】:

    标签: c# silverlight unit-testing rhino-mocks


    【解决方案1】:

    我将创建一个接口来表示您与 InvokeOperation 类的交互。创建一个简单地委托给真正的 InvokeOperation 类的“默认”实现。然后,您可以在模拟期间存根接口。

    接口不需要是 InvokeOperation 的成员和属性的完整副本——只要是您在应用程序中使用的那些。

    【讨论】:

    • 谢谢帕特里克!我刚刚结束了这个。我将 LoadOperation 包装在实体查询的接口后面。出于某种原因,我没有回到原来的 API 来包装 InvokeOperation。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多