17

私がインターフェースを持っているとしましょう:

public interface IFoo
{
    int Bar1 { get; set; }
    int Bar2 { get; set; }
}

IFooクラスの場合、次のように書くことができます。

fixture.CreateAnonymous<IFoo>();

Bar1結果には、とに設定された数値が含まれBar2ます。

しかし、インターフェースでこれを行う方法は? 私は使用しようとしましAutoMoqCustomizationたが、これはインターフェース自体ではなく、インターフェース型を持つプロパティのようです。

CreateAnonymousクラスのような自動化された方法を探しています。現在、インターフェイスのモックを作成し、そのプロパティを明示的に設定していますが、これは保存したい作業です。明らかな何かが欠けているに違いありません。

4

1 に答える 1

16

インターフェイスを特定の具象クラスにマップしたい場合は、確かにそれを行うことができます:

fixture.Register<IFoo>(() => fixture.CreateAnonymous<ConcreteFoo>());

(またはfixture.Register<IFoo>( fixture.CreateAnonymous<ConcreteFoo>)略して)

ただし、AutoMoq (および AutoRhinoMocks と AutoFakeItEasy) もオプションです。これにより、IFoo のインスタンスを作成しようとすると、IFoo を実装する Moq によって作成されたプロキシが返されます。

ただし、Moq を使用すると、Bar1 と Bar2 が読み込まれることはありません。これは、AutoFixture がセッターを呼び出さないだけでなく、Moq が (デフォルトで)ゲッターを実装していないためです。

これを Moq で機能させるには、Mock<T>それ自体で SetupAllProperties() を呼び出す必要があります。可能ではありますが、現在の AutoMoq グラフでそれを行うのは少し困難です。これにはすでに作業項目がありますが、議論を読み通すと、問題が思ったよりも複雑であることがわかります。

いずれにせよ、プロパティを持つインターフェイスは他の多くの理由からも悪い考えです。そのため、プロパティを持たないようにインターフェイスを再設計することが最善の解決策です。

于 2012-04-18T12:17:37.587 に答える