2016-08-15 52 views
2

私はMoqを使ってユニットテストをしようとしています。ここではサンプルコードです:私のテスト方法ではMoqで読み取り専用プロパティを設定するには?

public class ConcreteClass 
{ 
    private readonly FirstPropery firstProperty; 
    private readonly SecondProperty secondProperty; 

    public ConcreteClass(firstProperty, secondProperty) 
    { 
     this.firstProperty = firstProperty; 
     this.secondProperty = secondProperty; 
    } 
} 

[TestMethod] 
    var concreteClassMock = new Mock<ConcreteClass>() { CallBase = true }; 

、私は(工場によって作成された)実際のオブジェクトFirstPropertyオブジェクトを参照するfirstPropertyを設定し、後で別のオブジェクトの動作をテストするためにそれを使用したいです。それを達成する方法はありますか?

+2

私的なものはモックしません。モックは、実装によっては独立している必要があります。 – poke

答えて

2

普通は公開インターフェースのものを嘲笑しているだけなので、私的なメンバーをモックしません。したがって、モックは実装の詳細とは完全に独立しています。

言われて、あなたは、ターゲットのコンストラクタに渡されますMockコンストラクタにコンストラクタの引数を渡すことができること:あなたの目標は、実際にConcreteClassをテストすることである場合は、しかし、

new Mock<ConcreteClass>(firstProperty, secondProperty) {CallBase = true}; 

は、でなければなりません。実際のオブジェクトをテストする必要があります。したがって、依存関係を模倣し、必要に応じてそれらを渡しますが、実際にテストしたいオブジェクトを実際に保持してください。それ以外の場合は、テストしているオブジェクトの代わりにモックの動作を導入してテストすることができます。

var firstMock = new Mock<FirstProperty>(); 
var secondMock = new Mock<FirstProperty>(); 

var obj = new ConcreteClass(firstMock.Object, secondMock.Object); 

obj.DoSomething(); 
// assert stuff 
+0

具体的なクラスを模擬し、コンストラクタを介してパラメータを渡すことと、単純な「新しいConcreteClass(param1、param2)」との違いは何ですか?私は実際にコンストラクタ内のreadonlyプロパティを設定するオブジェクトをモックする必要がある場合について話します。 –

+0

@LouisaBickley私はあなたが何を意味するかは完全には分かっていませんが、あなたがテストしたいものに依存しています。テストしたいのであればXのクラスのコンストラクタであれば、実際の実装をあなたの模擬的な振る舞いで "置き換える"ため、あなたはそれを嘲笑してはいけません。 'X'の実装の詳細が' Y'のテストに影響を与えないように 'X'をモックするべきです - 新しい質問を開くことができるかもしれないので、これについてもう少し詳しく説明できますか? – poke

1

いくつかの発言:

1 - それは簡単にこのようなインターフェイスとgetメソッドでは達成することができます:あなたのシナリオに依存

public interface IConcreteClass 
{ 
    FirstProperty FirstProperty { get; } 
} 

    [Test] 
    public void TestCase() 
    { 
     var yourFirstPropertyImplementation = new FirstProperty(); 
     var concreteClassMock = new Mock<IConcreteClass>(); 
     concreteClassMock.Setup(o => o.FirstProperty).Returns(yourFirstPropertyImplementation); 
    } 

2-、あなたは本当に、部品番号が必要です真の実装を使用し、境界でのみmoqを使用するのはなぜですか?

3テストする内容を明確にする必要がありますか?それが具体的なクラスなら?またはプロパティ?またはいくつかの他のクラス?私が提案したテストケースは、具象クラスと他のクラスとの相互作用をテストするためにのみ有効です。

関連する問題