16

コンストラクター注入を使用する次のクラスがあります。

public class Service : IService
{
    public Service(IRepository repository, IProvider provider) { ... }
}

このクラスのほとんどのメソッドでは、 と の Moq モックを作成しIRepositoryIProviderを構築するだけServiceです。ただし、クラスには、同じクラスの他のいくつかのメソッドを呼び出すメソッドが 1 つあります。このメソッドをテストするには、これらすべてのメソッドをまとめてテストするのではなく、メソッドがこれらのメソッドを正しく呼び出し、戻り値を正しく処理することをテストしたいと考えています。

これを行う最善の方法は、モックを作成することServiceです。以前に Moq で具象クラスを問題なくモックしました。Moq でコンストラクター引数を必要とする具体的なクラスを問題なくモックしました。ただし、モックされたオブジェクトのコンストラクターにモックされた引数渡す必要があったのはこれが初めてです。当然、私はこのようにしようとしました:

var repository = new Mock<IRepository>();
var provider = new Mock<IProvider>();

var service = new Mock<Service>(repository.Object, provider.Object);

しかし、それはうまくいきません。代わりに、次のエラーが表示されます。

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: My.Namespace.Service.
Could not find a constructor that would match given arguments:
    Castle.Proxies.IRepository
    Castle.Proxies.IProvider

のコンストラクターがs やs のServiceような単純な引数を取る場合、これは正常に機能しますが、私がモックしているインターフェイスを取る場合は機能しません。これどうやってやるの?intstring

4

3 に答える 3

13

テストしているサービスを嘲笑するのはなぜですか?Service クラスの実装をテストしたい場合 (それがモック オブジェクトの呼び出しであるかどうかにかかわらず)、必要なのはテスト クラスではなく、2 つのインターフェイスのモックだけです。

それ以外の:

var repository = new Mock<IRepository>();
var provider = new Mock<IProvider>();

var service = new Mock<Service>(repository.Object, provider.Object);

むしろこれでいいんじゃない?

var repository = new Mock<IRepository>();
var provider = new Mock<IProvider>();

var service = new Service(repository.Object, provider.Object);

一部のフレームワークでは具体的なオブジェクトをモックできることはわかっていますが、意図した目的は何ですか? 何かをモックする背後にある考え方は、実際の実装を削除して、テストに影響を与えないようにすることです。しかし、あなたの質問では、特定のクラスが適切に呼び出されていることを知りたいと述べており、それらのアクションの結果を検証したいと考えています。これは間違いなく実装のテストであり、そのため、具体的なオブジェクトをモックする目的を理解するのに苦労しています。

于 2015-10-05T19:39:28.453 に答える
5

私の同等物がService内部コンストラクターを持っていたとき、私は非常によく似た問題を抱えていたので、Moqには見えませんでした。

追加した

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

実装プロジェクトの AssemblyInfo.cs ファイルに。関連性があるかどうかはわかりませんが、あなたや他の誰かに役立つ可能性がある場合に備えて、提案を追加したいと思いました.

于 2014-11-04T15:39:47.057 に答える
1

古いバージョンの問題に違いありません。最新バージョンですべて問題ありません。ニック、チェックしてください!

Ps: 間違って報奨金を開始しました (コンストラクターの署名が間違っていました)。

于 2015-10-04T17:42:44.917 に答える