2

次のようなAutofac解決をモックしようとしています

using System;
using Autofac;
using TypeMock.ArrangeActAssert;

class Program
{
    static void Main(string[] args)
    {
        var inst = Isolate.Fake.Instance<IContainer>();
        Isolate.Fake.StaticMethods(typeof(ResolutionExtensions), Members.ReturnNulls);
        Isolate.WhenCalled(() => inst.Resolve<IRubber>()).WillReturn(new BubbleGum());
        Console.Out.WriteLine(inst.Resolve<IRubber>());
    }
}

public interface IRubber
{}

public class BubbleGum : IRubber
{}

Moq 出身の私は、TypeMock の構文と例外にかなり混乱しています。最初にこれを TestMethod で実行したところ、「WhenCalled は補完動作なしでは実行できません」に似た例外が発生し続けました。私は全員とその母親の行動を定義しようとしましたが、役に立ちませんでした.

次に、テスト実行をステップ実行してデバッグし、Autofac から実際の例外が発生したことを確認しました: IRubber は登録されていません。

したがって、静的な Resolve 関数が偽造されていないことは明らかであり、どのように接続しようとしても、偽造することはできません。

Isolate.WhenCalled(() => ResolutionExtensions.Resolve<IRubber>(null)).WillReturn(new BubbleGum());

... IComponentContext を null にすることはできないという不平を言う Autofac から例外をスローします。おそらく偽造された IContainer をフィードする (または代わりに IComponentContext を偽造する) と、「IRubber が登録されていません」というエラーに戻ります。

4

1 に答える 1

2

これは、潮流に逆らって泳ぐケースの 1 つかもしれません。適切な依存関係が登録された「実際の」コンテナーを作成するために必要なコードの量は、TypeMock の構成よりも少ないか、似ています。その道を進むことをお勧めします。

ターゲット コンポーネントを IContainer にまったく依存させる代わりに、Func のような「リレーションシップ タイプ」を使用できます。これは Autofac によって暗黙的にサポートされ、より表現力があり、簡単にモック可能です。http://nblumhardt.com/2010/01/the-relationship-zoo/には、 http://code.google.com/p/autofac/wiki/DelegateFactoriesと同様に、そのアプローチに関する詳細情報があります。

于 2010-05-27T21:53:04.613 に答える