আমি কীভাবে এমন একটি পদ্ধতির মোকাবিলা করব যা তার স্বাক্ষরে একটি স্পষ্টভাবে নির্দিষ্ট করে না দিয়ে বা একটি ওভারলোড ব্যবহার না করে anচ্ছিক যুক্তি রয়েছে?


119

নিম্নলিখিত ইন্টারফেস দেওয়া:

public interface IFoo
{
    bool Foo(string a, bool b = false);
}

মোক ব্যবহার করে এটি উপহাস করার চেষ্টা করা হচ্ছে:

var mock = new Mock<IFoo>();
mock.Setup(mock => mock.Foo(It.IsAny<string>())).Returns(false);

সংকলনের সময় নিম্নলিখিত ত্রুটি দেয়:

একটি এক্সপ্রেশন ট্রিতে orচ্ছিক আর্গুমেন্টগুলি ব্যবহার করে এমন কোনও কল বা প্রার্থনা নাও থাকতে পারে

আমি উপরের ইস্যুটিকে মোকের তালিকার মোকের তালিকা হিসাবে উন্নত হিসাবে খুঁজে পেয়েছি এবং এটি 4.5 টি রিলিজে (যখনই হবে) নির্ধারিত বলে মনে হচ্ছে।

আমার প্রশ্ন: উপরোক্ত যে কোনও সময় শীঘ্রই ঠিক করা যাচ্ছে না তা দিয়ে আমি কী করব? আমার অপশনগুলি কেবলমাত্র প্রতিবারই এটি উপহাস করার পরে alচ্ছিক প্যারামিটারের ডিফল্ট মানটি স্পষ্টভাবে সেট করার জন্য (কোন ধরণের প্রথম স্থানে নির্দিষ্ট করে দেওয়ার পয়েন্টটি হারাতে পারে) বা বুল ছাড়াই একটি ওভারলোড তৈরি করতে (যেমন আমি কী করতাম সি # 4 এর পূর্বে)?

বা এই সমস্যাটি কাটিয়ে উঠতে কেউ আরও চালাক হয়ে উঠেছে?


5
কেবলমাত্র এটি নির্দিষ্ট করা যুক্তিসঙ্গত হবে? দ্বিতীয় প্যারামিটারের জন্য কোনও <বিউল> ()?
পল ডি অস্ট

দেড় বছর পরে এটি এখনও সত্য ..
মুকুস

@ মুকুস, একটি জনসংযোগ ছাড়াই নির্দ্বিধায়, ভাই
IamDOM

উত্তর:


91

আমি বিশ্বাস করি যে এই মুহূর্তে আপনার একমাত্র পছন্দটি boolসেটআপের ক্ষেত্রে প্যারামিটারকে স্পষ্টভাবে অন্তর্ভুক্ত করা Foo

আমি মনে করি না এটি কোনও ডিফল্ট মান নির্দিষ্ট করার উদ্দেশ্যকে পরাস্ত করে। ডিফল্ট মান কোডিং কল করার জন্য একটি সুবিধা, তবে আমি মনে করি যে আপনার পরীক্ষাগুলিতে আপনাকে স্পষ্ট হওয়া উচিত। বলুন আপনি boolপ্যারামিটার নির্দিষ্ট করে রেখে যেতে পারেন । যদি, ভবিষ্যতে কেউ ডিফল্ট মান পরিবর্তন কি হবে bথেকে true? এই ব্যর্থ পরীক্ষার (এবং আইনসঙ্গতভাবে তাই) হতে হবে, কিন্তু তারা লুকিয়ে ভাবনাটি হলো এই যে কারণে ফিক্স করার জন্য আরো কঠিন হবে bহয় falseboolপ্যারামিটারকে স্পষ্টভাবে উল্লেখ করার আরও একটি সুবিধা রয়েছে: এটি আপনার পরীক্ষার পাঠযোগ্যতার উন্নতি করে। তাদের মধ্য দিয়ে যাওয়া কেউ দ্রুত জানতে পারবেন যে একটি Fooফাংশন রয়েছে যা দুটি পরামিতি গ্রহণ করে। এটি আমার 2 সেন্ট, কমপক্ষে :)

যতবার আপনি এটি উপহাস করবেন প্রত্যেকবার এটি নির্দিষ্ট করার জন্য, নকল কোডটি তৈরি করবেন না: কোনও ফাংশনে মক তৈরি করুন এবং / অথবা আরম্ভ করুন, যাতে আপনার কেবলমাত্র একক দফা পরিবর্তন থাকে। আপনি যদি সত্যিই চান, আপনি মোখের আপাত সংক্ষিপ্ত-আগমনকে Fooএই আরম্ভের ফাংশনে নকল করে প্যারামিটারগুলি অনুলিপি করতে পারেন :

public void InitFooFuncOnFooMock(Mock<IFoo> fooMock, string a, bool b = false)
{
    if(!b)
    {
        fooMock.Setup(mock => mock.Foo(a, b)).Returns(false);
    }
    else
    {
        ...
    }
}

1
দুর্দান্ত উত্তর; আমি ইতিমধ্যে এগিয়ে গিয়েছিলাম এবং এটি আমার বিদ্রূপগুলিতে স্পষ্টভাবে নির্দিষ্ট করে দিয়েছি তবে কেন আপনার এই উত্তরটি করা উচিত তা আপনার উত্তর খুব স্পষ্ট এবং যৌক্তিক ফ্যাশনে নিশ্চিত করে। ধন্যবাদ, ক্রিস।
অ্যাপ্লাস

9
একটি ডিফল্ট প্যারামিটার পরিবর্তন করা "পরীক্ষা করা উচিত" ব্রেক করা উচিত। ডিফল্ট পরিবর্তন করা হলে পরীক্ষা না করা খারাপ পরীক্ষার লক্ষণ হতে পারে testing কোডটি ডিফল্ট ব্যবহার করতে পারে তবে পরীক্ষাগুলি না?
পপ ক্যাটালিন

কিছুক্ষন হয়ে গেছে, তবে আমি ইন্টারফেসের (মজারে আইডি সংযোগ) উপহাস করার চেষ্টা করার সময় মোকের সাথে এই পদ্ধতির চেষ্টা করেছি এবং এখনও আমি একই ত্রুটি পেয়েছি। কোন ধারণা কেন? নমুনা রেখা: mockDB.Setup (x => x.Query <MyObject> (It.IsAny <string> (), It.IsAny <ডায়নামিক প্যারামিটারস>)), It.IsAny <IDbTransaction> (), মিথ্যা, 600))। প্রত্যাবর্তন (নতুন তালিকা << MyObject> ()); শেষ দুটি মান হ'ল আমি যে পদ্ধতিতে সেট আপ করছি তার alচ্ছিক পরামিতি।
রায়েলশর্ক

4
Arrgggh! ভয়াবহ if (!x) {} else {}অ্যান্টি-প্যাটার্ন :)
নিকোডেমাস 13

1
@ নিকোডেমাস 13 হ্যাঁ, তবে আমি কোডের উদাহরণটি যতটা সম্ভব প্রশ্নটিতে ওপি-র উদাহরণের কাছাকাছি রাখার চেষ্টা করছিলাম। আমি অগত্যা এটির পক্ষে চাইব না :)
ক্রিস মেন্টল

8

আজই এই সমস্যাটির মুখোমুখি হয়েছে, মক এই ব্যবহারের ক্ষেত্রে সমর্থন করে না। সুতরাং, মনে হয় যে পদ্ধতিটি ওভাররাইড করা এই ক্ষেত্রে যথেষ্ট হবে।

public interface IFoo
{
    bool Foo(string a);

    bool Foo(string a, bool b);
}

এখন উভয় পদ্ধতি উপলব্ধ এবং এই উদাহরণ কাজ করবে:

var mock = new Mock<IFoo>();
mock.Setup(mock => mock.Foo(It.IsAny<string>())).Returns(false);

2

Moq সংস্করণ ব্যবহার করে 4.10.1 আমি নিম্নলিখিতটি করতে সক্ষম হয়েছি

ইন্টারফেস সহ:

public interface IFoo
{
    bool Foo(string a, bool b = false);
}

এবং মোক

var mock = new Mock<IFoo>();
mock.Setup(mock => mock.Foo(It.IsAny<string>(), It.IsAny<bool>())).Returns(false);

প্রথম প্যারামিটার ঠিক আছে দিয়ে ফু-তে একটি কল সমাধান করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.