2011-08-04 6 views
2

こんにちは、私はMockingを初めて使っています。Rhino MocksのようなMoq部分クラス

私はクラスを持っている:

public class Car 
{ 
    public virtual void Register() { 
     ... 
     Warrant(); 
    } 

    public virtual void Warrant() { 
     ... 
    } 
} 

私はそのRegister通話Warrantをテストしたいました。私はこれが正しいかどうかさえわからないが、仕事をするように見えた

[Test] 
public void RhinoCarTest() { 
    var mocks = new Rhino.Mocks.MockRepository(); 
    var car = mocks.PartialMock<Car>(); 

    mocks.ReplayAll(); 

    car.Stub(x => x.Warrant()); 

    car.Register(); 

    car.AssertWasCalled(x => x.Warrant()); 
} 

:RhinoMocksを使用して私が思い付きました。 Moqでも同じことをしたいと思っていました。私は部分的なMoqを見つけることができなかった。私がいた思い付いた何

[Test] 
public void MoqCarTest() { 
    var car = new Mock<Car>(); 

    car.Setup(x => x.Warrant()); 

    car.Object.Register(); 

    car.Verify(x => x.Warrant()); 
} 

これは、たとえ動作しません。誰かが私を正しい方向に向けることができますか?

答えて

1

モックやスタブを設定しない限り、Rhino.Mocksの部分クラスは基本クラスのメソッドを呼び出します。デフォルトでは、Moqはモックを作成してそれを具体的に行う場合にのみ基本クラスメソッドを呼び出します。ここではあなたの例のために働く例を示します

var car = new Mock<Car> {CallBase = true}; 
car.Object.Register(); 
car.Verify(c => c.Warrant(), Times.Once()); 

しかし、私は(特定のメソッドが呼び出されたことを確認する)この方法を試してみて避けるだろう。代わりに、テストではメソッドを呼び出した後に正しい「作業」が行われたことを確認するだけです。その作業がどのように行われるかは、メソッドのプライベート実装です。

特定のメソッドが呼び出されることを保証するテストを書くと、パフォーマンスやその他の問題のリファクタリング時に、テストは時間の経過とともに脆化する可能性があります。

+0

こんにちはPatrick Steele、あなたの答えに感謝します。これは、Registerメソッドをスタブしてスタブがテストに必要なものを返すようにすることが正しいと思います。次に、機能が正しいことをテストするだけです。もう1つのことは、あなたがあなたが言っている方法をチェックしてはならないと言ってもいいかどうかです。 – AnonyMouse

+0

Registerメソッドがテストしたいものならば、そこにあるバグがRegisterの単体テストに影響しないように、Warrantメソッドをスタブします。次に、Warrantの単体テストを書く。特定のオブジェクト(通常は依存関係)に対してメソッドが呼び出されていることを確認するためにVerifyを使用します。例:データをデータベースに保存するクラスがある場合、私は "更新"を呼び出す際に、私のIReporitoryの "保存"メソッドが呼び出されたことを確認します。同様に、そうでなければ呼び出されないようにすることができます。 – PatrickSteele

+0

こんにちは、パトリックスティール、その説明をいただきありがとうございます。 – AnonyMouse

関連する問題