ইউনিট পরীক্ষার জন্য আপনি সি # তে ফাইল সিস্টেমকে কীভাবে উপহাস করবেন?


149

ইউনিট টেস্টগুলি লেখার জন্য সি # তে ফাইল সিস্টেমকে উপহাস করার জন্য কি কোনও গ্রন্থাগার বা পদ্ধতি রয়েছে? আমার বর্তমান ক্ষেত্রে আমার কাছে এমন পদ্ধতি রয়েছে যা নির্দিষ্ট ফাইল উপস্থিত রয়েছে কিনা তা পরীক্ষা করে তৈরির তারিখটি পড়ে। ভবিষ্যতে আমার এর চেয়ে আরও বেশি প্রয়োজন হতে পারে।


1
এটি বেশ কয়েকটি অন্যের সদৃশ বলে মনে হচ্ছে, সহ: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 6464 .২77//২
জন স্যান্ডার্স


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

আমি ith উদ্দেশ্যে (এবং আরও) জন্য github.com/guillaume86/ ভার্চুয়ালপথ লিখেছি , এটি এখনও ডাব্লুআইপি এবং এপিআই অবশ্যই পরিবর্তন হবে তবে এটি ইতিমধ্যে কাজ করে, এবং কয়েকটি পরীক্ষা অন্তর্ভুক্ত রয়েছে।
Guillaume86

উত্তর:


154

সম্পাদনা করুন: নুগেট প্যাকেজ ইনস্টল করুন System.IO.Abstractions

এই উত্তরটি যখন প্রাথমিকভাবে গৃহীত হয়েছিল তখন এই প্যাকেজটির অস্তিত্ব ছিল না। মূল উত্তরটি নীচে historicalতিহাসিক প্রসঙ্গে সরবরাহ করা হয়েছে:

আপনি একটি ইন্টারফেস তৈরি করে এটি করতে পারেন:

interface IFileSystem {
    bool FileExists(string fileName);
    DateTime GetCreationDate(string fileName);
}

এবং সিস্টেম 'IO.File.Exists () ইত্যাদি ব্যবহার করে এমন একটি' বাস্তব 'বাস্তবায়ন তৈরি করে আপনি একটি উপহাসের কাঠামো ব্যবহার করে এই ইন্টারফেসটিকে উপহাস করতে পারেন; আমি মোককে সুপারিশ করি ।

সম্পাদনা করুন: কেউ এটি করেছেন এবং দয়া করে অনলাইনে এখানে পোস্ট করেছেন ।

আমি এই পদ্ধতির ব্যবহার করেছি ডেটটাইমকে উপহাস করার জন্য .একটি এখন একটি আইলক ইন্টারফেসে (সত্যই কার্যকরভাবে আমাদের পরীক্ষার সময় প্রবাহকে নিয়ন্ত্রণে রাখতে সক্ষম!) এবং আরও traditionতিহ্যগতভাবে, আইএসকিএলডিটাএ্যাকস ইন্টারফেসে।

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

আপনি কেবল এটি গ্রহণ করতে পারেন যে নির্দিষ্ট পদ্ধতিগুলি ইউনিট পরীক্ষামূলক নয় এবং সেগুলি একটি পৃথক ধীর-চলমান ইন্টিগ্রেশন / সিস্টেম টেস্ট স্যুটে পরীক্ষা করে।


1
আমার মতে, ম্যাট এখানে বর্ণিত হিসাবে একটি ইন্টারফেস তৈরি করে যাওয়ার উপায়। এমনকি আমি এমন একটি সরঞ্জাম লিখেছি যা আপনার জন্য এই জাতীয় ইন্টারফেস তৈরি করে, যা স্থিতিশীল এবং / অথবা সিল করা ক্লাসগুলি, বা অ-নিরস্তক (যেমন ক্লক এবং এলোমেলো সংখ্যা জেনারেটর) উপহাস করার চেষ্টা করার সময় দরকারী useful আরও তথ্যের জন্য jolt.codeplex.com দেখুন ।
স্টিভ গুইদি

দেখে মনে হচ্ছে রেফার্ড নিবন্ধের রেপো মুছে ফেলা হয়েছে / নোটিশ ছাড়াই সরানো হয়েছে। তবে, এখানে তার প্রচেষ্টার একটি ন্যুগেট প্যাকেজ উপস্থিত রয়েছে: nuget.org/packages/mscorlib-mock
মাইক-ই

টাইপমকে কোন প্রকারের ভুয়া তার উপর বিধিনিষেধ রয়েছে তবে (কমপক্ষে অক্টোবর 2017 হিসাবে বর্তমান সংস্করণে) আপনি অবশ্যই ফাইল স্ট্যাটিক ক্লাসটি নকল করতে পারেন। আমি কেবল এটি নিজে যাচাই করেছি।
রায়ান রোডমায়ার

আপনি কিছু সংহত পরীক্ষার স্যুট যোগ করতে পারেন?
ওজকান

83

ইনস্টল-প্যাকেজ সিস্টেম.আইও.অ্যাবস্ট্রাকশন

এই কাল্পনিক গ্রন্থাগারটি এখন বিদ্যমান, সিস্টেমের জন্য একটি নিউগেট প্যাকেজ রয়েছে Iআও.অ্যাবস্ট্রাকশন , যা সিস্টেম.আইও নেমস্পেসকে বিমূর্ত করে।

পরীক্ষার সহায়কগুলির একটি সেটও রয়েছে, System.IO.Abstferences.TestingHelpers যা - লেখার সময় - কেবলমাত্র আংশিকভাবে প্রয়োগ করা হয়, তবে এটি একটি খুব ভাল সূচনা পয়েন্ট।


3
আমি মনে করি যে ইতিমধ্যে নির্মিত অ্যাবস্ট্রাকশনটির চারপাশে মান নির্ধারণ করা সেরা বাজি। Library লাইব্রেরিটি কখনও শুনেনি, তাই মাথা আপ করার জন্য অনেক ধন্যবাদ।
জুলাইগলন

প্রধানমন্ত্রী প্যাকেজ ম্যানেজারের জন্য দাঁড়িয়েছে .. খোলার জন্য ... সরঞ্জামগুলি> নুগেট প্যাকেজ ম্যানেজার> প্যাকেজ ম্যানেজার কনসোল
থানাডোটো

11

আপনার সম্ভবত ফাইল সিস্টেম থেকে কী জিনিস প্রয়োজন তা নির্ধারণ করার জন্য একটি চুক্তি তৈরি করতে হবে এবং তারপরে সেই কার্যকারিতার চারপাশে একটি মোড়ক লিখুন। এই মুহুর্তে আপনি বাস্তবায়নকে উপহাস করতে বা আটকে রাখতে সক্ষম হবেন।

উদাহরণ:

interface IFileWrapper { bool Exists(String filePath); }

class FileWrapper: IFileWrapper
{
    bool Exists(String filePath) { return File.Exists(filePath); }        
}

class FileWrapperStub: IFileWrapper
{
    bool Exists(String filePath) 
    { return (filePath == @"C:\myfilerocks.txt"); }
}

5

আমার সুপারিশটি হ'ল http://systemwrapper.codeplex.com/ ব্যবহার করা কারণ এটি সিস্টেম নেমস্পেসে বেশিরভাগ ব্যবহৃত ধরণের জন্য মোড়ক সরবরাহ করে provides


আমি বর্তমানে এই লাইব্রেরিটি ব্যবহার করছি এবং এখন আমি আবিষ্কার করেছি যে ফাইল স্ট্রিমের মতো জিনিসগুলির জন্য এর বিমূর্তকরণগুলিতে আইডিসপোজেবল অন্তর্ভুক্ত নয়, আমি একটি প্রতিস্থাপনের সন্ধান করছি। লাইব্রেরি যদি আমাকে স্ট্রিমগুলি সঠিকভাবে নিষ্পত্তি করতে দেয় না, তবে আমি এই ধরণের ক্রিয়াকলাপ পরিচালনা করার জন্য এটিকে প্রস্তাব (বা ব্যবহার) করতে পারি না।
জেমস নেল

1
সিস্টেমরেপ্পারের আইফাইল স্ট্রিমআর্যাপগুলি এখন আইডিসপোজেবল কার্যকর করে।
টিস্টার

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

3

আমি এর নিম্নলিখিত সমাধানগুলি পেয়েছি:

  • ইন্টিগ্রেশন পরীক্ষা লিখুন, ইউনিট পরীক্ষা নয় not এটি কাজ করার জন্য আপনার এমন একটি ফোল্ডার তৈরি করার একটি সহজ উপায় দরকার যেখানে আপনি অন্যান্য পরীক্ষাগুলি হস্তক্ষেপের বিষয়ে চিন্তা না করেই স্টাফ ফেলে দিতে পারেন। আমার একটি সাধারণ টেস্টফোল্ডার শ্রেণি রয়েছে যা ব্যবহারের জন্য প্রতি টেস্ট পদ্ধতি ফোল্ডারটি তৈরি করতে পারে।
  • একটি উপহাসযোগ্য সিস্টেম.আইও.ফাইলে লিখুন। এটি একটি IFile.cs তৈরি করা হয় । আমি এটি ব্যবহারের প্রায়শই পরীক্ষাগুলির সমাপ্তি পাই যা কেবলমাত্র আপনি প্রহসনমূলক বিবৃতি লিখতে পারেন তা প্রমাণ করে তবে আইওর ব্যবহারটি কম হলে এটি ব্যবহার করবেন।
  • আপনার বিমূর্ততার স্তর পরীক্ষা করুন এবং ক্লাস থেকে ফাইল আইও বের করুন। এটির জন্য একটি ইন্টারফেস তৈরি করুন। অবশিষ্টগুলি ইন্টিগ্রেশন টেস্টগুলি ব্যবহার করে (তবে এটি খুব ছোট হবে)। ফাইলটি করার পরিবর্তে এটি উপরে থেকে পৃথক হয় .আপনিটি লিখতে পড়ুন, ioTingie.loadSettings () বলুন
  • System.IO.Abstration । আমি এটি এখনও ব্যবহার করি নি, তবে এটিই আমি নিয়ে খেলে সবচেয়ে বেশি আগ্রহী।

আমি যা লিখছি তার উপর নির্ভর করে আমি উপরের সমস্ত পদ্ধতি ব্যবহার করে শেষ করি। আমি যখন আইও-তে আঘাত করে ইউনিট পরীক্ষাগুলি লিখি তখন বেশিরভাগ সময় আমি বিমূর্তিটি চিন্তা করে শেষ করি।


4
IFile.cs এর লিঙ্কটি নষ্ট হয়ে গেছে।
মাইক-ই

3

System.IO.Abstrations এবং System.IO.Abstferences.TestingHelpers এর মতো ব্যবহার করে :

public class ManageFile {
   private readonly IFileSystem _fileSystem;
   public ManageFile(IFileSystem fileSystem){

      _fileSystem = fileSystem;
   }

   public bool FileExists(string filePath){}
       if(_fileSystem.File.Exists(filePath){
          return true;
       }
       return false;
   }
}

আপনার টেস্ট ক্লাসে, আপনি মকফায়ারসিসটেম () ব্যবহার করে ফাইল উপহাস করুন এবং আপনি ম্যানেজফাইলে পছন্দ করেন:

var mockFileSysteme = new MockFileSystem();
var mockFileData = new MockFileData("File content");
mockFileSysteme.AddFile(mockFilePath, mockFileData );
var manageFile = new ManageFile(mockFileSysteme);

2

আপনি মাইক্রোসফ্ট জালিয়াতি ব্যবহার করে এটি করতে পারেন আপনার কোডবেস পরিবর্তন করার প্রয়োজন ছাড়াই এটি উদাহরণস্বরূপ এটি ইতিমধ্যে হিমায়িত ছিল।

প্রথমে System.dll - বা অন্য যে কোনও প্যাকেজের জন্য একটি জাল সমাবেশ তৈরি করুন এবং তারপরে প্রত্যাশিত রিটার্নকে মক করুন:

using Microsoft.QualityTools.Testing.Fakes;
...
using (ShimsContext.Create())
{
     System.IO.Fakes.ShimFile.ExistsString = (p) => true;
     System.IO.Fakes.ShimFile.ReadAllTextString = (p) => "your file content";

      //Your methods to test
}

1

.NET ফাইল এপিআইএস সত্যই ইন্টারফেস বা এক্সটেনসিবল ক্লাসগুলির উপর ভিত্তি করে নয় যেগুলি উপহাস করা যায় a

তবে ফাইল সিস্টেমটি অ্যাক্সেস করার জন্য যদি আপনার নিজস্ব ক্রিয়ামূলক স্তর থাকে তবে আপনি ইউনিট পরীক্ষায় এটি উপহাস করতে পারেন।

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


1

আপনি কীভাবে ফাইল সিস্টেমটিকে উপহাস করবেন তা আমি নিশ্চিত নই। আপনি যা করতে পারছেন তা হল পরীক্ষার জন্য প্রয়োজনীয় কাঠামো সহ একটি ফোল্ডার ইত্যাদি তৈরির জন্য একটি পরীক্ষার ফিক্সচার সেটআপ লিখুন। একটি টিয়ারডাউন পদ্ধতি পরীক্ষাগুলি চালানোর পরে এটি পরিষ্কার করে দেবে।

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


1

আপনার নির্দিষ্ট প্রশ্নের উত্তর দেওয়ার জন্য: না, এমন কোনও লাইব্রেরি নেই যা আপনাকে ফাইল I / O কলগুলিকে মক করতে দেয় (যা আমি জানি)। এর অর্থ হ'ল "সঠিকভাবে" ইউনিটটি আপনার ধরণের পরীক্ষার জন্য আপনি যখন আপনার প্রকারগুলি সংজ্ঞায়িত করেন তখন এই বিধিনিষেধকে বিবেচনায় নেওয়া দরকার।

আমি কীভাবে একটি "যথাযথ" ইউনিট পরীক্ষার সংজ্ঞা দিচ্ছি তার সম্পর্কে দ্রুত দিক নোট। আমি বিশ্বাস করি যে ইউনিট পরীক্ষাগুলি নিশ্চিত হওয়া উচিত যে আপনি প্রত্যাশিত আউটপুট পেয়েছেন (এটি ব্যতিক্রম হতে পারে, কোনও পদ্ধতিতে কল করা ইত্যাদি) প্রদত্ত পরিচিত ইনপুটগুলি। এটি আপনাকে ইনপুট এবং / অথবা ইনপুট রাজ্যের সেট হিসাবে আপনার ইউনিট পরীক্ষার শর্তগুলি সেট আপ করতে দেয় allows এটি করার সর্বোত্তম উপায়টি হ'ল ইন্টারফেস-ভিত্তিক পরিষেবাদি এবং নির্ভরতা ইনজেকশন ব্যবহার করা যাতে কোনও প্রকারের বাইরের প্রতিটি দায়িত্ব কোনও কনস্ট্রাক্টর বা সম্পত্তির মধ্য দিয়ে যাওয়া ইন্টারফেসের মাধ্যমে সরবরাহ করা যায়।

সুতরাং, এটি মনে রেখে, আপনার প্রশ্নে ফিরে আসুন। আমি বাস্তবায়নের IFileSystemServiceসাথে একটি ইন্টারফেস তৈরি করে ফাইল সিস্টেম কলগুলি উপহাস করেছি FileSystemServiceযা কেবলমাত্র mscorlib ফাইল সিস্টেমের পদ্ধতির উপরের একটি মুখোমুখি। আমার কোডটি তখন IFileSystemServicemscorlib ধরণের পরিবর্তে ব্যবহার করে । FileSystemServiceঅ্যাপ্লিকেশনটি চলমান বা উপহাস করার সময় এটি আমার মানকে প্লাগ করতে দেয়IFileSystemService আমার ইউনিট পরীক্ষায় । অ্যাপ্লিকেশন কোডটি এটি কীভাবে চালিত হয় তা নির্বিশেষে একই, তবে অন্তর্নিহিত অবকাঠামো সেই কোডটি সহজেই পরীক্ষার অনুমতি দেয়।

আমি স্বীকার করব যে এমএসসিআরলিব ফাইল সিস্টেম অবজেক্টগুলির চারপাশে মোড়ক ব্যবহার করা একটি বেদনা তবে এই নির্দিষ্ট পরিস্থিতিতে, পরীক্ষা এত সহজ এবং নির্ভরযোগ্য হয়ে ওঠার কারণে এটি অতিরিক্ত কাজের জন্য মূল্যবান।


1

একটি ইন্টারফেস তৈরি করা এবং পরীক্ষার জন্য এটি উপহাস করা যাওয়ার সবচেয়ে পরিষ্কার উপায়। তবে বিকল্প হিসাবে আপনি মাইক্রোসফ্ট মোলস কাঠামোটি একবার দেখে নিতে পারেন ।


0

সাধারণ সমাধানটি কিছু অ্যাবস্ট্র্যাক্ট ফাইল সিস্টেম এপিআই ব্যবহার করছে ( জাভা জন্য অ্যাপাচি কমন্স ভিএফএস এর মতো ): সমস্ত অ্যাপ্লিকেশন লজিক এপিআই এবং ইউনিট পরীক্ষা ব্যবহার করে স্টাব বাস্তবায়ন (মেমরির এমুলেশন বা এর মতো কিছু) সহ বাস্তব ফাইল সিস্টেমকে উপহাস করতে সক্ষম।

সি # এর জন্য অনুরূপ এপিআই বিদ্যমান: NI.Vfs যা অ্যাপাচি ভিএফএস ভি 1 এর সাথে খুব মিল similar এটিতে স্থানীয় ফাইল সিস্টেম এবং মেমোরি ফাইল সিস্টেম উভয়ের জন্য ডিফল্ট প্রয়োগ রয়েছে (শেষটি বাক্স থেকে ইউনিট পরীক্ষায় ব্যবহার করা যেতে পারে)।


-1

আমরা বর্তমানে মালিকানাধীন ডেটা ইঞ্জিন ব্যবহার করি এবং এর এপিআই ইন্টারফেস হিসাবে প্রকাশিত হয় না তাই আমরা আমাদের ডেটা অ্যাক্সেস কোডটি খুব কমই পরীক্ষা করতে পারি। তারপরে আমি ম্যাট এবং জোসেফের কাছেও গেলাম।


-2

আমি জেমি আইডির প্রতিক্রিয়া নিয়ে যাব। আপনি যা লিখেননি সেগুলি উপহাস করার চেষ্টা করবেন না। এমন সমস্ত ধরণের নির্ভরশীলতা থাকবে যা আপনি জানতেন না - সিল করা ক্লাস, নন ভার্চুয়াল পদ্ধতি ইত্যাদি

আর একটি উপায় হ'ল আপোকেট পদ্ধতিগুলি এমন কিছু যা মকেটযোগ্য with উদাহরণস্বরূপ ফাইলওয়ার্পার নামে একটি শ্রেণি তৈরি করুন যা ফাইল পদ্ধতিগুলিতে অ্যাক্সেসের অনুমতি দেয় তবে এমন কিছু যা আপনি উপহাস করতে পারেন।

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