0

クラス内のインスタンスをモックしようとしています。これはクラス(簡略化)です:

public void CreatePhotos(string elementType) 
{ 
    var foo = new PicturesCreation(); 

    //some code here...

    if (elementType == "IO") 
    { 
        foo.CreateIcons(client, new PicturesOfFrogsCreation(), periodFrom, periodTo)
    } 
}

そのため、ユニットテスト用にこの「newPicturesOfFrogsCreation()」をモックして、CreateIconsがこのパラメーターで呼び出されるかどうかを確認しようとしています。テストでこれを達成するためにRhinoMocks/ AssertWasCalledメソッドを使用しようとしましたが、インターフェイスをモックする方法を知っているだけなので、機能していないようです。これをモックすることが可能かどうか知っていますか?

更新:PicturesCreationクラスのコード:

internal sealed class PicturesCreation 
    { 
      public void CreateIcons(IPictures foo, int periodFrom, int periodTo) 

         { 
            foo.CreateIcons(periodFrom, periodTo); 
         } 
    }

そしてPicturesOfFrogsCreationのコード:

internal sealed class PicturesOfFrogsCreation : IPictures
{ 

    public void CreateIcons(int periodFrom, int periodTo) 
      { 
         //Code that implements the method
      } 
}

私はこのテストを書きましたが、うまく書かれているかどうかはわかりません。

public void Create_commitment_transaction_should_be_called_for_internal_order() 
    { 

       IPicture fooStub = RhinoStubWrapper<IPicture>.CreateStubObject(); 

       rebuildCommitmentsStub.StubMethod(x => x.CreateIcons(Arg<int>.Is.Anything, Arg<int>.Is.Anything));

       PicturesProcess.CreatePhotos("IO"); 

       rebuildCommitmentsStub.AssertWasCalled(x => x.CreateIcons(Arg<int>.Is.Anything,Arg<int>.Is.Anything));

    }

前もって感謝します!

A。

4

3 に答える 3

4

あなたのコードは、正直に言うと設計されていないようです。メソッド内でインスタンスをインスタンス化してからメソッドを呼び出すため、それをモックするのは困難です。

このメソッドまたはクラスのコンストラクターにインスタンスを渡してフィールドにキャプチャする場合、モックに置き換えることができます。チェックしているメソッドがあれば、ほとんどのモック フレームワーク (Rhino を含む) でこれを行うことができます。仮想です。


編集:あなたの編集から、問題のクラスが封印されていることがわかります。これにより、それらは本質的にモック不可能になります。クラスのモックは、モックされるクラスから継承するプロキシ クラスを作成することで機能します。シールされている場合、これは実行できません。

于 2013-01-10T16:15:41.077 に答える
1

モックしたい依存関係を注入する必要があります。ローカル変数はメソッドに対してプライベートであり、アサートできません。例 -

public class Photo{
  private IPicturesCreation foo;
  public test(IPicturesCreation picturesCreation)
  {
    foo = picturesCreation;
  }

  public void CreatePhotos(string elementType) 
    { 
    //some code here...

    if (elementType == "IO") 
       { 
           foo.CreateIcons(client, new PicturesOfFrogsCreation(), periodFrom, periodTo)
       } 
    }
}

そして、このようにテストします

public class PhotoTest{
    public testFunctionCall(){
    var mockPicturesCreation = new Mock<IPicturesCreation>();
    new Photo(mockPicturesCreation.Object).CreatePhotos("blah");
    mockPicturesCreation.Verify(x => x.CreateIcons(.....), Times.Once);
    }
}
于 2013-01-10T16:20:09.647 に答える