2012-08-24 22 views
6

私はRhino Mockを使用したメソッド呼び出しを追跡したいと思います。Rhino Mock、VerifyAllExpectations

public class A 
{ 
    protected IB _b; 

    public A(IB b) 
    { 
     _b = b; 
    } 

    public void Run(string name) 
    {    
     _b.SomeCall(new C { Name = name }); 
    } 
}  

public interface IB 
{ 
    void SomeCall(C c); 
}  

public class C 
{ 
    public string Name { get; set; } 
    // more attributes here 
} 

などの試験が見えます:Rhinoのモックフレームワークは、2つの異なるCクラスを検出するので、テストがExpectedViolationExceptionで失敗

// prepare 
var bMock = Rhino.Mocks.MockRepository.GenerateStrictMock<IB>(); 
bMock.Expect(x => x.SomeCall(new C { Name = "myname" })); 
var sut = new A(bMock); 

// execute 
sut.Run("myname"); 

// assert 
bMock.VerifyAllExpectations(); 

のは、私はこのコードを持っていると仮定しましょう。

テスト中の被験者がテスト中のメソッドにオブジェクトパラメータを作成する場合、コールをチェックするにはどうすればよいですか? Rhino Mocksにパラメータを "Equals"としてチェックさせる機会はありますか?

ありがとうございます!

答えて

12

私はあなたがはるかに簡単に(そしてより保守)AAAの構文を使用することを推奨します。ほとんどの場合、厳格なモックは何よりも痛みがあります。

引数はEqualsを使用して比較されます。 CEqualsを上書きしない場合は、参照によって比較され、あなたのケースでは一致しません。他の方法で引数を確認するには、Matchesを使用してください。

// arrange 
var bMock = MockRepository.GenerateMock<IB>(); 
var sut = new A(bMock); 

// act 
sut.Run("myname"); 

// assert 
bMock.AssertWasCalled(x => x.SomeCall(Arg<C>.Matches(y => y.Name == "myname")); 
+0

こんにちは、コンパイラは言う: "それはデリゲート型ではないので、 'Rhino.Mocks.Constraints.AbstractConstraint'型にラムダ式を変換することはできません。 "x => x.Name =" myname "" – Jordi

+0

は、割り当て(=)を比較(==)に固定しました。 –

+0

まだ同じ問題。私は何かを欠いている? http://imageshack.us/f/708/errorah.png/ – Jordi

2

あなたがIgnoreArgumentsを追加する必要があり、さらに「SomeCall」への呼び出しのパラメータcontraintsを追加することができます。

bMock.Expect(x => x.SomeCall(new C { Name = "myname" })) 
    .IgnoreArguments() 
    .Constraints(new PropertyConstraint(typeof(C), "Name", 
     Rhino.Mocks.Constraints.Is.Equal("myname"))); 
+0

thanks mate!素敵なトリック今日私は学んだ。その問題は数週間私を悩ませていた。 – Jordi

+1

この構文は古くなっています。新しいAAA構文を使用してください。ここでは、文字列にプロパティ名は必要ありません。次の行の引数を無視すると、新しいCを渡すことはありません。 –

関連する問題