1

これを TypeMock フォーラムに投稿しましたが、応答を待つのが待ちきれません。これは非常に不自然な質問です。

偽の IContainer を設定しようとしています。ここに私が持っているものがあります:

var container = Isolate.Fake.Instance<IContainer>(); 
var program = Isolate.Fake.Instance<IProgram>(); 

Isolate.WhenCalled(() => container.Resolve<IProgram>()).WillReturn(program);

IProgram私のコードのインターフェースです)。

このコードを実行しようとすると、「要求されたサービス MyApp.IProgram が登録されていません」という Autofac 例外が発生します。

しかし、この例外はどのようにスローされるのでしょうか? 私は実際に container.Resolve() を呼び出しているわけではありませんよね? 偽の IProgram を返すように設定しているだけです。

無関係な背景情報: Autofac は拡張メソッドを広範囲に使用し、Moq はそれらをモックしないため、TypeMock を試しています。

4

2 に答える 2

3

役立つかもしれないいくつかのこと - 最初に、すべての拡張メソッドが委譲する をResolve()セットアップすることにより、Moq で呼び出しをモックできます。IComponentContext.Resolve()

次に、Autofac は、コンポーネントからそのインターフェイスを使用する必要がないように設計されています。例については、次を参照してください。

使用する(したがってモックする)必要がある場合、または同様のインターフェースを使用する必要がある場合は、 、および/または関係タイプIContainerを使用して同じことを行うことができます。FuncIIndexOwned

お役に立てれば!ニック

于 2010-08-19T03:35:47.310 に答える
2

残念ながら、Isolator には現在 Autofac コンテナの偽造を防ぐバグがあります。できるだけ早く解決できるよう取り組んでいます。

それまでの間、意図したとおりに Autofac を使用していない理由はありますか。つまり、次のような偽のインスタンスを返す必要があります。

[TestFixture]
public class TestClass
{
    private ContainerBuilder builder;
    private IContainer container;

    [SetUp]
    public void SetUp()
    {
        builder = new ContainerBuilder();
    }

    [Test, Isolated]
    public void Test1()
    {
        var fakeProgram = Isolate.Fake.Instance<IProgram>();

        builder.RegisterInstance(fakeProgram).As<IProgram>();
        container = builder.Build();

        var program = container.Resolve<IProgram>();

        Assert.AreEqual(fakeProgram, program);
    }
}
于 2010-08-19T07:06:15.643 に答える