سؤال

ولقد حصلت على التطبيق الذي يستخدم خدمة WCF. الآن أود أن إضافة وحدة الاختبارات إلى التطبيق.

لبعض الحالات ولست بحاجة للسخرية من خدمة WCF، منذ الحصول على السلوك المطلوب من الخدمة في بعض الأحيان صعبة (خدمة مثل رميات استثناءات خاصة).

وبوسعي أن أضيف بعد اجهة أخرى إلى العميل تمويل رأس المال العامل، ولكن هذا يبدو سخيفا بعض الشيء، منذ يدعو العميل بالفعل تستخدم واجهة.

هل هناك طريقة سهلة للسخرية خدمة WCF؟ أسهل من خلق طبقة واجهة أخرى وإعادة توجيه كل مكالمة WCF واحدة داخله؟

وتحرير: معظم الإجابات يبدو لا يعرف الكثير عن خدمة WCF استخدام، وحتى بعض التوضيح:
لاستخدام خدمة WCF من ViewModel، لا بد لي من إدارة الاتصال شيء من هذا القبيل:

ChannelFactory<IMyWcfService> channelFactory = new ChannelFactory<IMyWcfService>("");
IMyWcfService proxy = channelFactory.CreateChannel();
proxy.CallMyStuff();
proxy.Close();

وأنا لا يمكن أن يمر ViewModel الوكيل لصندوق رأس المال العامل، منذ الصدد لا بد من فتحها وإغلاقها عن كل معاملة. لهذا السبب باستخدام أن RhinoMock / NMock لا تعمل، لأنها تحتاج إلى ViewModel الذي يحصل الوكيل كمعلمة، والتي لا يمكن أن يتم مثل هذا إذا كنت تستخدم WCF.

هل كانت مفيدة؟

المحلول

لماذا لا يمكنك استخدام شيء من هذا القبيل NMock2 للسخرية من واجهات IMyWcfService مباشرة؟

إذا كنت تحتاج إلى أن تكون قادرة على خلق حالات جديدة على الطاير، استخدم مصنع لإخفاء ChannelFactory<IMyWcfService> من العميل. بهذه الطريقة يمكنك استبدال مصنع، وتوفير عميل واحد مما يخلق يسخر بدلا من وكلاء الحقيقي.

نصائح أخرى

ويمكنك استخدام أي إطار ساخرا مثل RhinoMocks أو NMock، للسخرية من العقد واجهة، لذلك إذا خدمتكم نفذت IMyService ثم هل يمكن استخدام إطار ساخرا لوضع التوقعات على استدعاء الأسلوب على تلك الواجهة. إذا كنت لم تكن مألوفة مع هذا المفهوم بعد ذلك يمكنك ببساطة إنشاء كائن قائم في أن تنفذ IMyService لكن يدعي أن تكون خدمة حقيقية أثناء الاختبار. بهذه الطريقة عندما يتم استدعاء أساليب ما يطلق عليه على هاتفك يقف في وجوه ويمكن أن يكون لديك الاحتياطية في مقابل كل ما تريد أن.

وأنت يمكنك Moq إطار ساخرا. وبناء على المثال الذي قمت بتقديمها:

ChannelFactory<IMyWcfService> channelFactory = new ChannelFactory<IMyWcfService>("");
IMyWcfService proxy = channelFactory.CreateChannel();
proxy.CallMyStuff();
proxy.Close();

وهنا هو كيف يمكن لتنفيذ ساخرا سيبدو:

Mock<IMyWcfServiceChannel> channelMock = new Mock<IMyWcfServiceChannel>(MockBehavior.Strict);
channelMock
    .Setup(c => c.CallMyStuff())
    .Returns("");

string myStuff = channelMock.Object.CallMyStuff();

وبعد إضافة وكيل لخدمة WCF - يجب أن يكون واجهة channel المتاحة لك، ودعا IMyWcfServiceChannel

واعتمادا على نوع عودة أسلوب خدمة الذي تتصل به - يمكنك تعيين مجرد عن أي إنتاج. في المثال أعلاه اعتدت نوع string كمثال على ذلك.

ولكي تتمكن من استخدام الحل أعلاه أكثر كفاءة قد ترغب في إنشاء 2 الصانعين لطبقة رجال الأعمال مثل ذلك:

public class Example1
{
    IMyWcfServiceChannel _client;

    public Example1()
    {
        var factory = new ChannelFactory<IMyWcfServiceChannel>("binding");
        _client = factory.CreateChannel();
    }

    public Example1(IMyWcfServiceChannel client)
    {
        _client = client;
    }

    public string CallMyStuff()
    {
        return _client.CallMyStuff();
    }
}

وهكذا على prod استخدام منشئ المعلمة أقل. في اختبارات unit استخدام منشئ المعلمة كاملة وتمرير وهمية لأنها (channelMock.Object).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top