5

RhinoMocksを使用してメソッドの呼び出しを追跡したいと思います。私がこのコードを持っていると仮定しましょう:

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
}

そして、テストは次のようになります。

// 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フレームワークが2つの異なるCクラスを検出するため、テストはExpectedViolationExceptionで失敗します。

テスト対象のサブジェクトがテスト対象のメソッドにオブジェクトパラメータを作成する場合、呼び出しを確認するにはどうすればよいですか?Rhino Mocksにパラメータを「等しい」としてチェックするように指示する機会はありますか?

トンありがとう!

4

2 に答える 2

11

はるかに簡単な(そしてより保守しやすい)AAA構文を使用することをお勧めします。ほとんどの場合、厳密なモックは何よりも苦痛です。

引数はを使用して比較されEqualsます。Cがオーバーライドされない場合、Equals参照によって比較され、あなたのケースでは一致しません。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"));
于 2012-08-24T07:59:32.870 に答える
2

IgnoreArgumentsを追加する必要があり、さらに'SomeCall'への呼び出しのパラメーター制約を追加できます。

bMock.Expect(x => x.SomeCall(new C { Name = "myname" }))
    .IgnoreArguments()
    .Constraints(new PropertyConstraint(typeof(C), "Name", 
        Rhino.Mocks.Constraints.Is.Equal("myname")));
于 2012-08-24T07:50:00.020 に答える