2

Rhino Mocksから始めて、非常に単純な問題を抱えているimは、プロパティを設定するvoidを使用してクラスをモックする方法を教えてください。

class SomeClass : ISomeClass
{
    private bool _someArg;

    public bool SomeProp { get; set; }

    public SomeClass(bool someArg)
    {
        _someArg = someArg; 
    }

    public void SomeMethod()
    {
        //do some file,wcf, db operation here with _someArg
        SomeProp = true/false;
    }
}

明らかに、これは非常に不自然な例です、ありがとう。

4

4 に答える 4

6

あなたの例では、テスト対象のクラスの機能をテストしているように見えるので、RhinoMocksは必要ありません。代わりに、単純な単体テストを実行します。

[Test]
public void SomeTest()
{
    var sc = new SomeClass();
        // Instantiate SomeClass as sc object
    sc.SomeMethod();
        // Call SomeMethod in the sc object.

    Assert.That(sc.SomeProp, Is.True );
        // Assert that the property is true... 
        // or change to Is.False if that's what you're after...
}

他のクラスに依存するクラスがある場合は、モックをテストする方がはるかに興味深いです。あなたの例では、次のように述べています。

//ここで_someArgを使用してファイル、wcf、db操作を実行します

つまり、他のクラスがSomeClassのプロパティを設定することを期待します。これは、モックテストの方が理にかなっています。例:

public class MyClass {

    ISomeClass _sc;

    public MyClass(ISomeClass sc) {
        _sc = sc;
    }

    public MyMethod() {
        sc.SomeProp = true;
    }

}

必要なテストは次のようになります。

[Test]
public void MyMethod_ShouldSetSomeClassPropToTrue()
{
    MockRepository mocks = new MockRepository();
    ISomeClass someClass = mocks.StrictMock<ISomeClass>();

    MyClass classUnderTest = new MyClass(someClass);

    someClass.SomeProp = true;
    LastCall.IgnoreArguments();
        // Expect the property be set with true.

    mocks.ReplayAll();

    classUndertest.MyMethod();
        // Run the method under test.

    mocks.VerifyAll();
}
于 2009-01-22T12:17:40.377 に答える
3

モック オブジェクトでどの程度の忠実度が必要かによって異なります。それを行う簡単な方法は、それを気にせず、ばかげた期待ステートメントを書き出すことです。

[Test]
public void SomeTest()
{
   MockRepository mocks = new MockRepository();
   ISomeClass mockSomeClass = mocks.StrictMock<ISomeClass>();
   using(mocks.Record())
   {
      using(mocks.Ordered())
      {
         Expect.Call(MockSomeClass.SomeProp).Return(false);
         Expect.Call(delegate{MockSomeClass.SomeMethod();});
         Expect.Call(MockSomeClass.SomeProp).Return(true);
      }
   }
}

順序付けられた一連の応答を使用せずに実際のオブジェクトのように動作するものが必要な場合は、expect で do メソッドを使用してデリゲートを設定する必要があります。

delegate bool propDelegate();
delegate void methodDelegate();
private bool m_MockPropValue = false;

[Test]
public void SomeTest()
{
   MockRepository mocks = new MockRepository();
   ISomeClass mockSomeClass = mocks.StrictMock<ISomeClass>();
   using(mocks.Record())
   {
      SetupResult.For(MockSomeClass.SomeProp).Do(new propDelegate(delegate
      {
         return this.m_MockPropValue;
      }));
      Expect.Call(delegate{MockSomeClass.SomeMethod();}).Do(new methodDelegate(delegate
      {
         this.m_MockPropValue = true;
      }));
   }
}
于 2009-01-22T00:30:39.617 に答える
0

SetupResult.Forまたはで何かを準備するとき、Expect.Callそれらがvirtualであることを確認する必要があります。そうしないと、RhinoMocks は独自の実装を作成できません。

それ以外の場合は、スコット・ペダーセンが示したように、結果を設定して予想される呼び出しを行うだけの問題です

于 2009-01-22T00:34:12.870 に答える
0

テストしようとしているオブジェクトが何であるかという質問からは完全には明らかではありません- SomeClass. SomeMethod() がプロパティを設定することを単に確認したい場合は、単純な状態ベースを実行できるため、モックする必要はありませんテスト:

[TestMethod]
public void SomeMethodTest()
{
    SomeClass s = new SomeClass();
    s.SomeMethod();

    Assert.AreEqual(expectedValue, s.SomeProp);
}

または、 SomeClass が他のクラスの依存関係であり、そのクラスと SomeClass の間の相互作用をテストしたい場合は、RhinoMock を使用して、テストの「記録」セクションでメソッド呼び出しの期待値を次のように設定します。

[TestMethod]
    public void CheckInteractionWithSomeClass()
    {
        MockRepository mocks = new MockRepository();
        ISomeClass someClass = mocks.StrictMock<ISomeClass>();

        using (mocks.Record())
        {
            //record expection that someClass.SomeMethod will be called...
            someClass.SomeMethod();
        }

        using (mocks.Playback())
        {
            //setup class under test - ISomeClass is injected through the constructor here...
            ClassUnderTest o = new ClassUnderTest(someClass);

            o.MethodOnClassUnderTestThatShouldCallSomeClass.SomeMethod();

            //any other assertions...
        }
    }
于 2009-01-22T11:43:18.760 に答える