4

私はこれを検索しましたが、すべてをキャッチしているようですが、残念ながら私が読んだものはすべてそれを理解するのに役立ちません. クラスは次のとおりです。

public interface IMockInterface
{
    MockClass MockedMethod();
    MockClass MockThis();
}

public class MockClass : IMockInterface
{
  public virtual MockClass MockedMethod()
  {
    MockClass returnValue;

    returnValue = new MockClass();
    returnValue.SomeMessage = "Not mocked";
    return returnValue;
  }

  public MockClass MockThis()
  {
    MockClass mock;
    MockClass returnValue;

    mock = new MockClass();

    return mock.MockedMethod();
  }
}

そしてテスト:

public void MockTest_Internal()
{
  MockClass mainClass;
  MockClass returnedClass;
  IMockInterface mockProvider;

  mainClass = new MockClass();

  mockProvider = repository.StrictMock<IMockInterface>();
  Expect.Call(mockProvider.MockedMethod())
    .Return(new MockClass { SomeMessage = "Mocked" });
  repository.ReplayAll();

  returnedClass = mainClass.MockThis();
  provider.AssertWasCalled(item => item.MockedMethod());

  Assert.IsTrue(returnedClass.SomeMessage == "Mocked");
}

また、試してみましたが機能しません

しかし、私はこの例外を受け取り続けています:

Rhino.Mocks.Exceptions.ExpectationViolationException:
IMockInterface.MockedMethod(); 期待された #1、実際の #0

私が読んだことから、これは、メソッドが予想とは異なるパラメーターで呼び出されたか、メソッドが呼び出されなかったが呼び出されることが予想されていたことを示唆しています。これはテストの場合ではありません。

補足: 社内コードなしで Rhino.Mocks を実際に使用するのはこれが初めてなので、基本的には作業を進めていきます。ここには本当にばかげた何かがあるかもしれません...

これはコメントされた古いテストでしたが、私が使用すべきだったものではありません:

public void MockTest_Internal()
{
  MockClass mainClass;
  MockClass returnedClass;
  IMockInterface mockProvider;

  mainClass = new MockClass();

  var provider = MockRepository.GenerateStub<IMockInterface>();
  provider.Stub(item => item.MockedMethod())
    .Return(new MockClass { SomeMessage = "Mocked" });

  returnedClass = mainClass.MockThis();
  provider.AssertWasCalled(item => item.MockedMethod());

  Assert.IsTrue(returnedClass.SomeMessage == "Mocked");
}
4

2 に答える 2

3

プロバイダー オブジェクトで MockedMethod クラスをスタブするようにモック フレームワークに指示していますが、使用する mainClass オブジェクトにプロバイダーを挿入することはありません。何を達成しようとしているのかは明確ではありませんが、モックされたメソッドを呼び出す場合は、スタブが設定されたオブジェクトで呼び出す必要があります。

以下のように定義すればMockThis、うまくいくことがわかると思います。

public MockClass MockThis(IMockInterface provider)
{
    return provider.MockMethod();
}

要点は、メソッドがプロバイダーで呼び出されたことはなく、mainClass オブジェクトでのみ呼び出されたため、例外が発生することです。

編集:例

public class ClassUnderTest
{
    private ProviderClass provider { get; set; }

    public ClassUnderTest( ProviderClass provider )
    {
        this.Provider = provider;
    }

    public int DoOperation()
    {
        return this.Provider.ProviderOperation();
    }
}

public class ProviderClass
{
    private int value = 42;
    public ProviderClass()
    {
    }

    public virtual int ProviderOperation()
    {
        return this.value;
    }
}


[TestMethod]
public void DoOperationTest()
{
     ProviderClass mockProvider = MockRepository.GenerateMock<ProviderClass>();
     mockProvider.Expect( mp => mp.ProviderOperation() ).Return( -1 );

     ClassUnderTest target = new ClassUnderTest( mockProvider );

     int expectedValue = -1;
     int value = target.DoOperation();

     Assert.AreEqual( expectedValue, value );

     mockProvider.VerifyAllExpectations();
}

通常、ProviderClass オブジェクトは ProviderOperation メソッドから 42 を返しますが、これをモックアウトして、-1 を返すように指示しました。ClassUnderTest DoOperation メソッドが呼び出されると、モック プロバイダー オブジェクトの ProviderOperation メソッドが呼び出され、モック値 -1 が返されます。

お役に立てれば。

于 2008-12-15T21:55:53.183 に答える
0

通常、このエラーは、テストで構築したオブジェクト引数を使用してスタブ化されたメソッドが呼び出され、テストされたコードでそのメソッドを呼び出す前にオブジェクトが構築された場合に発生します。解決策は、を使用することRhino.Mocks Matches()です。

元:

Arg<string>.Matches(s => s.Contains("some substring"))
于 2019-03-12T14:03:02.183 に答える