2

100回以上のテストで次の行がありました:

var registry = new Mock<ObjectRegistry>(new List<Assembly>()).Object;

少しリファクタリングして、ObjectRegistry コンストラクターを次のように変更しました。

public ObjectRegistry(AssemblyRegistry assemblies, UserPromt userPromt)

そのため、100 個のテストケースすべてを更新して、代わりに次のモックを使用する必要があります。

var objectRegistry = new Mock<ObjectRegistry>(Mock.Of<AssemblyRegistry>(), Mock.Of<UserPromt>());

そして、私が望むのは、必要な依存関係に関係なく、すべての依存関係がモックされ、不変であることだけです。

必要なすべての依存関係を自動的にモックするように Moq に何らかの方法で指示できますか?

Mockitoを使用したJavaでは、これはまったく問題になりません...

4

2 に答える 2

3

ここでは具体的なオブジェクトをモックしています。Moq は、インターフェイスで使用すると最適に機能します。オブジェクトではなくロールをモックしてみてください(pdf)。たとえば、 などのインターフェイスを導入しますIObjectRegistry。現時点では、コードは ObjectRegistry を扱っていることを認識していますが、理想的にはいつでも実装を切り替えることができるはずです。抽象化が整っている場合。代わりに「インターフェイスにプログラムする」ことは、テスト容易性とプログラミングのベスト プラクティスの両方にとって理想的です。ここでのインターフェースは、必ずしも C#/Java などの観点からのインターフェースを意味するわけではありません。

var registry = new Mock<IObjectRegistry>();

public class ObjectRegistry : IObjectRegistry { // Snip }

次に、これを使用します。これはインターフェイスなので、具象 (リアル/プロダクション) クラスとそのコンストラクタを自由に変更できます。テストとシステムの残りの部分は認識されません。レジストリがインターフェイスに 1 つのメソッドを持っている場合、GetObjectシステムはインスタンスで動作しているという事実ではなく、単にこの抽象化に依存する必要がありObjectRegistryます。

現在、コードは実際に の実際のインスタンスを作成してObjectRegistryから、問題のメソッドをスタブ化/モック化しています。ほとんどの場合、これは理想的ではありません。

于 2013-02-23T18:07:18.180 に答える
1

問題のベスト プラクティスは、具体的なクラスの代わりにインターフェイスを使用し、それらのインターフェイスによって依存関係を渡すことです。

public ObjectRegistry(IAssemblyRegistry assemblies, IUserPromt userPromt)

于 2013-02-24T09:52:01.363 に答える