2

私は RhinoMocks を試しています (始めたばかりです。優しくしてください!)、なぜこのセットアップを使用するのか混乱しています:

var mockRepos = new MockRepository();
var mockServiceProvider = mockRepos.DynamicMock<IServiceProvider>(null);
var mockContext = mockRepos.DynamicMock<IPluginExecutionContext>(null);

mockServiceProvider.Expect(x => x.GetService(typeof(IPluginExecutionContext))).Return(mockContext);

var someSampleClass = new SomeClassOrOther(mockServiceProvider);

SomeClassOrOther のある時点で、メソッドGetServiceが呼び出されます

var context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

そして例外を引き起こします:

 Unable to cast object of type 'Castle.Proxies.ObjectProxyd0bf4b879a6341bbba3478cf1189d621' to type 'Microsoft.Xrm.Sdk.IPluginExecutionContext'.

ただし、次を使用する場合:

var mockServiceProvider = MockRepository.GenerateMock<IServiceProvider>(null);
var mockContext = MockRepository.GenerateMock<IPluginExecutionContext>(null);

mockServiceProvider.Expect(x => x.GetService(typeof(IPluginExecutionContext))).Return(mockContext);

つまり、静的MockRepository.GenerateMockであり、エラーなしで実行されます。

ここでどこが間違っていますか?

4

2 に答える 2

2

なぜこの例外が発生するのかわかりません。ただし、「古い」非静的構文を使用すると、モックが「記録」状態になります。それらを使用する前に、再生モードに設定する必要があります。

var mockRepos = new MockRepository();
var mockServiceProvider = mockRepos.DynamicMock<IServiceProvider>();
var mockContext = mockRepos.DynamicMock<IPluginExecutionContext>();

mockRepos.ReplayAll();

mockServiceProvider
    .Stub(x => x.GetService(typeof(IPluginExecutionContext)))
    .Return(mockContext);

var someSampleClass = new SomeClassOrOther(mockServiceProvider);
于 2012-06-01T12:21:58.843 に答える
1

AAA新しい構文と古い構文が混在していRecord/Replayます。Expect拡張メソッドと新しい構文を使用している場合AAA、モック リポジトリを操作してそのモードを手動で変更 (記録/再生) する必要はありません。新しい静的メソッド (再生モードでモックを作成する) でモックを作成し、後で期待値を検証します。

// Arrange
var mockServiceProvider = MockRepository.GenerateMock<IServiceProvider>();
var mockContext = MockRepository.GenerateMock<IPluginExecutionContext>();

mockServiceProvider.Expect(x => x.GetService(typeof(IPluginExecutionContext)))
                   .Return(mockContext);

var someSampleClass = new SomeClassOrOther(mockServiceProvider);
// Act

// Assert
mockServiceProvider.VerifyAllExpectations();

Record/Replay比較のための古い構文は次のとおりです。

var mockRepos = new MockRepository();
var mockServiceProvider = mockRepos.DynamicMock<IServiceProvider>();
var mockContext = mockRepos.DynamicMock<IPluginExecutionContext>();

Expect.Call(mockServiceProvider.GetService(typeof(IPluginExecutionContext)))
      .Return(mockContext);
mockRepos.ReplayAll();

var someSampleClass = new SomeClassOrOther(mockServiceProvider);
// exercise your SUT
mockRepos.VerifyAll();  
于 2012-06-01T13:29:03.330 に答える