কনস্ট্রাক্টরের প্যারামিটার থাকলে মোকের সাথে বস্তুগুলি উপহাস করে


94

আমার একটি বস্তু রয়েছে যা আমি moq ব্যবহার করে উপহাস করার চেষ্টা করছি। অবজেক্টের কনস্ট্রাক্টরের প্রয়োজনীয় প্যারামিটার রয়েছে:

public class CustomerSyncEngine {
    public CustomerSyncEngine(ILoggingProvider loggingProvider, 
                              ICrmProvider crmProvider, 
                              ICacheProvider cacheProvider) { ... }
}

এখন আমি moq এর v3 "সেটআপ" বা v4 "মক.ওফ" সিনট্যাক্স ব্যবহার করে এই বস্তুর জন্য মক তৈরির চেষ্টা করছি তবে এটি সনাক্ত করতে পারছি না ... আমি চেষ্টা করছি এমন সমস্ত কিছুই বৈধ নয়। আমার এখন অবধি যা আছে তা এখানেই রয়েছে তবে শেষ পংক্তিটি আমাকে একটি বাস্তব অবজেক্ট দিচ্ছে, মক না। আমি এটি করার কারণটি হ'ল আমি যাচাই করতে চাই কাস্টমারসিনসিইংইনে আমার কাছে পদ্ধতিগুলি বলা হচ্ছে ...

// setup
var mockCrm = Mock.Of<ICrmProvider>(x => x.GetPickLists() == crmPickLists);
var mockCache = Mock.Of<ICacheProvider>(x => x.GetPickLists() == cachePickLists);
var mockLogger = Mock.Of<ILoggingProvider>();

// need to mock the following, not create a real class like this...
var syncEngine = new CustomerSyncEngine(mockLogger, mockCrm, mockCache);

আপনি কল করা যাচাই করতে চান এমন একটি নমুনা পদ্ধতি সরবরাহ করতে পারেন?
Ciaran

4
সুতরাং যদি আমার ইন্টারফেসের চেয়ে ক্লাসের উপর নির্ভরতা থাকে তবে আমার এমনকি তাদের নির্ভরতাও উপহাস করতে হয়, এটি পুনরাবৃত্তিতে নেমে যায়। শেষ পর্যন্ত আমি আমার কোডটি টেস্টেবল রাখার জন্য কিছু ইন্টারফেস ব্যবহার করতে বাধ্য হচ্ছি, এমনকি আমার কোডে ইন্টারফেসের প্রয়োজন না থাকলেও। আমি মনে করি অনেকগুলি ইন্টারফেসটি কংক্রিটের ক্লাসগুলি উপহাস করার চেয়ে আরও বড় গন্ধ ...
ট্যারিওন

উত্তর:


34

শেষ লাইনটি আপনাকে একটি প্রকৃত উদাহরণ দিচ্ছে কারণ আপনি নতুন কীওয়ার্ডটি ব্যবহার করছেন, গ্রাহকসিনসিএনগাইনকে উপহাস করছেন না।

আপনার ব্যবহার করা উচিত Mock.Of<CustomerSyncEngine>()

মকিং কংক্রিটের ধরণের একমাত্র সমস্যাটি হ'ল মোকের জন্য সর্বজনীন ডিফল্ট কনস্ট্রাক্টর (কোনও প্যারামিটার ছাড়াই) প্রয়োজন হবে অথবা আপনার কনস্ট্রাক্টর আর্গ স্পেসিফিকেশন সহ Moq তৈরি করতে হবে। http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html

সর্বোত্তম কাজটি হ'ল আপনার ক্লাসে ডান ক্লিক করুন এবং এক্সট্র্যাক্ট ইন্টারফেসটি বেছে নিন।


4
সমস্যার ক্ষেত্রে, একটি বিকল্প হ'ল অটোমকিং পাত্রে ব্যবহার করা। আমার প্রিয় মেশিন F মেশিনের সাথে একযোগে জড়িত। স্পেসিফিকেশন, একটি অটোমকিং কন্টেইনার ব্যবহার করে আরও ছোট পৃষ্ঠের অঞ্চলগুলি পরীক্ষা করা সহজ করে তোলে। ধরুন অ্যান্ড্রু এমন একটি পদ্ধতি যাচাই করার জন্য প্রয়োজন CustomerSyncEngineযা কেবলমাত্র ICrmProvidertraditionalতিহ্যবাহী উপহাসের প্রয়োগগুলির সাথে ব্যবহার করে সমস্ত 3 টি ইন্টারফেসের জন্য সরবরাহ করা উচিত যেখানে অটোমকিংয়ের ধারক আপনাকে কেবল একটি সরবরাহ করতে দেয়।
ক্রিস মেরিসিক

74

শেষ লাইনটি এ পরিবর্তন করুন

var syncEngine = new Mock<CustomerSyncEngine>(mockLogger, mockCrm, mockCache).Object;

এবং এটি কাজ করা উচিত


4
নিশ্চিত নয় যে এই মন্তব্যটি আমার উত্তরে কীভাবে প্রযোজ্য?
সুহাস

4
কারণ এটি মক লগার হিসাবে একটি সংকলন ত্রুটির কারণ হতে পারে এবং অন্যরা একটি ব্যতিক্রম ছুঁড়ে ফেলবে যে তাদের কোনও বস্তুর সম্পত্তি নেই
জাস্টিন পিহনি

4
ওপি লক, ক্রিম, এবং ক্যাশে ধরণের মক তৈরি করতে মক.ওফ <টি> () ব্যবহার করছে বলে, প্রত্যাবর্তিত বস্তু টি ম্যাক <T> হিসাবে নয়, টি হিসাবে ফিরে আসে। সুতরাং, মকলগার.অবজেক্ট ইত্যাদির প্রয়োজন নেই যখন সেগুলি মক অফ কাস্টমারসিনসিগাইনকে দেওয়ার সময় এবং @ জাস্টিনপিহনি যেমন উল্লেখ করেছেন, আপনাকে একটি ডিজাইনের সময় ত্রুটি দেখাতে হবে।
জোশ গুস্ট

4
@ সুহাস তার হওয়া উচিত নয়new Mock<CustomerSyncEngine>(new object[]{mockLogger, mockCrm, mockCache}).Object;
গিরিবি

@ গিরিবি দরকার নেই, তবে সম্ভব, কারণ পোকামগুলি পরমগুলির সাথে সংজ্ঞায়িত করা হয়েছে। পাবলিক মক (প্যারামস অবজেক্ট [] আরগস)
জিও হার্নেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.