يبدو أن إعداد السلوك على طريقة ما هو استدعاء الطريقة
سؤال
لقد نشرت هذا على منتديات TypeMock ، لكنني نفاد صبر جدًا لانتظار الرد هناك. هذا سؤال N00B للغاية.
أحاول إعداد icontainer مزيفة. هذا ما لدي:
var container = Isolate.Fake.Instance<IContainer>();
var program = Isolate.Fake.Instance<IProgram>();
Isolate.WhenCalled(() => container.Resolve<IProgram>()).WillReturn(program);
(IProgram
هي واجهة في الكود الخاص بي).
عندما أحاول تشغيل هذا الرمز ، أحصل على استثناء من Autofac: "لم يتم تسجيل الخدمة المطلوبة myapp.iprogram."
كيف يمكن إلقاء هذا الاستثناء؟ أنا في الواقع لا أتصل بالحاوية. resolve () ، أليس كذلك؟ أنا فقط أقوم بإعداده لإرجاع برنامج iProgram مزيف.
معلومات خلفية غير ذات صلة: أنا أقوم بتجربة Typemock لأن Autofac يستخدم أساليب التمديد على نطاق واسع ولن يسخرها MOQ.
المحلول
بضعة أشياء قد تساعد - أولاً ، يمكنك السخرية Resolve()
مكالمات مع MOQ عن طريق الإعداد IComponentContext.Resolve()
, ، والتي تفوض جميع أساليب التمديد.
ثانياً ، تم تصميم Autofac بحيث لا يجب عليك استخدام واجهاتها من مكوناتك. انظر للحصول على أمثلة:
- http://nblumhardt.com/2010/01/the-relationship-zoo/
- http://code.google.com/p/autofac/wiki/TypedNamedAndandKeyedServices و
- http://code.google.com/p/autofac/wiki/DelegateFactories
حيث تحتاج إلى استخدام (وبالتالي السخرية) IContainer
أو واجهة مماثلة ، ربما يمكنك فعل الشيء نفسه باستخدام Func
, IIndex
و/أو Owned
أنواع العلاقات.
أتمنى أن يساعدك هذا! نيك
نصائح أخرى
لسوء الحظ ، يوجد حاليًا خطأ في العزل ، مما يمنع حاويات التزوير 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);
}
}