7

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オブジェクトを参照するように設定し、後でそれを使用して別のオブジェクトの動作をテストしたいと考えています。それを達成する方法はありますか?

4

2 に答える 2

5

通常、何かのパブリック インターフェイスをモックしているだけなので、プライベート メンバーをモックすることはありません。したがって、モックは実装の詳細から完全に独立しています。

そうは言っても、コンストラクター引数をMockコンストラクターに渡し、それをターゲットのコンストラクターに渡すことができます。

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

ただし、実際に をテストすることが目的の場合は、そのモックを作成しないConcreteClassでください。実際のオブジェクトをテストする必要があります。したがって、その依存関係をモックし、必要に応じてそれらを渡しますが、実際にテストしたいオブジェクトを実際に保持してください。それ以外の場合は、テストしているオブジェクトではなく、モックからの動作を導入してテストする可能性があります。

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

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

obj.DoSomething();
// assert stuff
于 2016-08-15T09:08:12.653 に答える
3

いくつかのコメント:

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が本当に必要ですか?真の実装を使用して、境界でのみmoqを使用しないのはなぜですか?

3-何をテストしたいのかを明確にする必要がありますか?具象クラスなら?またはプロパティ?または他のクラス?1 で提案したテスト ケースは、具象クラスと他のクラスとの相互作用をテストする場合にのみ有効です。

于 2016-08-15T09:07:15.593 に答える