5

最初に私の質問、次にいくつかの詳細:

Q:プロパティの値が後続の代入で確実に使用されるようにする場合、プロパティの値をスタブ化する必要がありますか?

詳細:
MSpec クラスで Rhino Mocks 3.5 の AAA 構文を使用しています。以下のコードは、(願わくば) 簡単に理解できるようにトリミングしました。

*_fooResultMock のプロパティ値をスタブしない:*

[Subject("Foo")]
public class when_foo {
    Establish context = () => {
        _fooDependencyMock.Stub(x => x.GetResult()).Return(_fooResultMock);
        _foo = new Foo(_fooDependencyMock);
    };

    Because action = () => {
        _foo.Whatever();
    };

    It should_set_the_name_field = () => {
        _fooTargetMock.AssertWasCalled(x => x.Name = _fooResultMock.Name);
    };
}

*_fooResultMock のプロパティ値のスタブ:*

[Subject("Foo")]
public class when_foo {
    Establish context = () => {
        _fooDependencyMock.Stub(x => x.GetResult()).Return(_fooResultMock);
        _fooResultMock.Stub(x => x.Name).Return(_theName); // _theName!
        _foo = new Foo(_fooDependencyMock);
    };

    Because action = () => {
        _foo.Whatever();
    };

    It should_set_the_name_field = () => {
        _fooTargetMock.AssertWasCalled(x => x.Name = _theName); // _theName!
    };
}

私のテストで重要なことは、_fooResultMock のプロパティで見つかった値が _fooTargetMock のNameプロパティに割り当てられることです。

では、最初のコード ブロックはそれを適切にテストするのでしょうか、それとも 2 番目のコード ブロック (_fooResultMock のNameプロパティの値をスタブ化する) が必要なのでしょうか?

2 番目のブロックは何らかの理由で望ましくありませんか?

4

1 に答える 1

1

正しい答えを示すいくつかの質問:

  • _fooResultMock は具象クラスの PartialMock ですか? その場合、Name をスタブしないと、実際のクラスの Name プロパティの値が取得されます。_fooResultMock が PartialMock ではなく、それをスタブしない場合、Name の型のデフォルト (おそらく null) を取得します。

  • _fooTargetMock とは何ですか? このテストではどこにも指定されていません。代わりに _foo であるはずですか?

結果のモックは部分的なモックではないと想定しています。部分モックの主なケースは、1 つのクラスのいくつかのメソッドを同じクラスの他のメソッドから分離することです (たとえば、ファイル書き込みメソッドをモックして、ファイル書き込みメソッドを呼び出す計算メソッドをテストできます)。この場合、ターゲット モックが結果モックから Name フィールドを取得したかどうかにかかわらず、最初のコード ブロックは基本的に null と null を比較しています。したがって、2 番目のコード ブロックは、代入が発生したかどうかをテストするのに適しています。

于 2011-05-19T20:26:46.380 に答える