2011-03-11 104 views
1

我有一個數據服務接口與方法:嘲諷的invokeOperation進行單元測試使用犀牛製品

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); 
    } 

但它從來沒有因此導致的執行......原來, :

系統。 ServiceModel.DomainServices.Client.InvokeOperation

是一個密封類,並且運行時,犀牛嘲笑拋出一個異常

無法建立密封類

我的嘲笑我正在尋求改進我的設計以支持此測試案例的建議;並仍然使用嘲笑。

回答

1

我將創建一個接口,它表示您與InvokeOperation類的交互。創建一個簡單委託給真正的InvokeOperation類的「默認」實現。然後,您可以在模擬期間將接口截斷。

該接口不需要是InvokeOperation成員和屬性的完整副本 - 只是您在應用程序中使用的成員和屬性。

+0

謝謝Patrick! 我剛結束這樣做。我正在將** LoadOperation **封裝在Entity查詢的接口後面。出於某種原因,我沒有回到我原來的API來包裝InvokeOperation。 – 2011-03-11 23:24:36