উত্তর:
আমি বিশ্বাস করি এটির একটি মানক পদ্ধতি হল কনফিগারেশন ম্যানেজারটি মোড়ানোর জন্য একটি ফ্যাকাস প্যাটার্ন ব্যবহার করা এবং তারপরে আপনার কিছুটা looseিলে .ালাভাবে জুড়ে থাকে যা আপনার নিয়ন্ত্রণে রয়েছে have
সুতরাং আপনি কনফিগারেশন ম্যানেজার মোড়ানো হবে। কিছুটা এইরকম:
public class Configuration: IConfiguration
{
public User
{
get
{
return ConfigurationManager.AppSettings["User"];
}
}
}
(আপনি কেবলমাত্র আপনার কনফিগারেশন ক্লাস থেকে একটি ইন্টারফেস বের করতে পারেন এবং তারপরে আপনার কোডের যে কোনও জায়গা থেকে ইন্টারফেসটি ব্যবহার করতে পারেন) তারপরে আপনি কেবল আইকনফাইগ্রেশনটিকে উপহাস করবেন। আপনি কয়েকটি ভিন্ন উপায়ে নিজেই মুখোমুখি বাস্তবায়ন করতে সক্ষম হতে পারেন। উপরে আমি পৃথক বৈশিষ্ট্যগুলি মোড়ানোর জন্য বেছে নিয়েছি। আপনি দুর্বল টাইপ করা হ্যাশ অ্যারের পরিবর্তে কাজ করার জন্য দৃ strongly়ভাবে টাইপ করা তথ্য থাকার পার্শ্ব সুবিধাটিও পান।
var configurationMock = new Mock<IConfiguration>();
এবং সেটআপের জন্য:configurationMock.SetupGet(s => s.User).Returns("This is what the user property returns!");
আমি AspnetMvc4 ব্যবহার করছি। এক মুহুর্ত আগে লিখেছিলাম
ConfigurationManager.AppSettings["mykey"] = "myvalue";
আমার পরীক্ষার পদ্ধতিতে এবং এটি পুরোপুরি কার্যকর হয়েছিল।
ব্যাখ্যা: পরীক্ষার পদ্ধতিটি অ্যাপ্লিকেশন সেটিংস, সাধারণত একটি web.config
বা থেকে নেওয়া সংক্রান্ত প্রসঙ্গে চলে myapp.config
। ConfigurationsManager
এই অ্যাপ্লিকেশন-গ্লোবাল অবজেক্টে পৌঁছাতে এবং এটিকে পরিচালনা করতে পারে ulate
যদিও: আপনার যদি সমান্তরালে টেস্ট রানার চলমান পরীক্ষা থাকে তবে এটি ভাল ধারণা নয়।
ConfigurationManager.AppSettings
এটি একটি NameValueCollection
যা থ্রেড-নিরাপদ নয়, সুতরাং সমান্তরাল পরীক্ষাগুলি সঠিক সিঙ্ক্রোনাইজেশন ছাড়াই এটি ব্যবহার করা যাইহোক ভাল ধারণা নয়। অন্যথায় আপনি কেবল ConfigurationManager.AppSettings.Clear()
আপনার TestInitialize
/ সিটিতে কল করতে পারেন এবং আপনি সোনার।
হতে পারে আপনি যা সম্পাদন করার প্রয়োজন তা নয়, তবে আপনি কি আপনার পরীক্ষার প্রকল্পে একটি app.config ব্যবহার করার কথা বিবেচনা করেছেন? সুতরাং কনফিগারেশন ম্যানেজারটি আপনি যে মানগুলি অ্যাপকনফাইগ এ রেখেছিলেন তা পাবে এবং আপনাকে কোনও উপহাস করার দরকার নেই। এই সমাধানটি আমার প্রয়োজনগুলির জন্য দুর্দান্ত কাজ করে, কারণ আমাকে কখনই "ভেরিয়েবল" কনফিগার ফাইল পরীক্ষা করার দরকার নেই।
Web.config
প্রকল্পের আওতাধীন থেকে রানটাইমের সময় টানা হয় are পরীক্ষার সময়, এর থেকে কিছু সুপরিচিত মানগুলি টানানো app.config
খুব কার্যকর। ইউনিট টেস্টে কেবল "ক্লাস্টার 1" বলার সময় শর্তগুলি নিশ্চিত করা দরকার; এক্ষেত্রে কেবল 4 টি আলাদা ক্লাস্টার রয়েছে।
আপনি AppSettings
কাস্টম NameValueCollection
অবজেক্টে পরিবর্তন করতে শিম ব্যবহার করতে পারেন । আপনি কীভাবে এটি অর্জন করতে পারেন তার একটি উদাহরণ এখানে দেওয়া হয়েছে:
[TestMethod]
public void TestSomething()
{
using(ShimsContext.Create()) {
const string key = "key";
const string value = "value";
ShimConfigurationManager.AppSettingsGet = () =>
{
NameValueCollection nameValueCollection = new NameValueCollection();
nameValueCollection.Add(key, value);
return nameValueCollection;
};
///
// Test code here.
///
// Validation code goes here.
}
}
মাইক্রোসফ্ট ফেকসের সাথে টেস্টের অধীনে আইসোলেটিং কোডে আপনি শিম এবং জাল সম্পর্কে আরও পড়তে পারেন । আশাকরি এটা সাহায্য করবে.
আপনি কি ঠাট্টা-বিদ্রূপ করার পরিবর্তে খড়খড়ি বিবেচনা করেছেন? AppSettings
সম্পত্তি একটি হল NameValueCollection
:
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
// Arrange
var settings = new NameValueCollection {{"User", "Otuyh"}};
var classUnderTest = new ClassUnderTest(settings);
// Act
classUnderTest.MethodUnderTest();
// Assert something...
}
}
public class ClassUnderTest
{
private readonly NameValueCollection _settings;
public ClassUnderTest(NameValueCollection settings)
{
_settings = settings;
}
public void MethodUnderTest()
{
// get the User from Settings
string user = _settings["User"];
// log
Trace.TraceInformation("User = \"{0}\"", user);
// do something else...
}
}
সুবিধাগুলি একটি সহজ বাস্তবায়ন এবং সিস্টেমের উপর নির্ভরতা নেই on কনফিগারেশনের আপনার সত্যিকার প্রয়োজন না হওয়া পর্যন্ত।
IConfiguration
জোশুয়া এনফিল্ডের পরামর্শ অনুসারে কনফিগারেশন ম্যানেজারটিকে মোড়ানো খুব উচ্চ স্তরের হতে পারে এবং আপনি সম্ভবত খারাপ কনফিগার মান পার্সিংয়ের মতো জিনিসগুলির কারণে যে বাগগুলি রয়েছেন তা মিস করতে পারেন। অন্যদিকে, ConfigurationManager.AppSettings
লসমানোসের পরামর্শ হিসাবে সরাসরি ব্যবহার করা বাস্তবায়নের বিশদগুলির অনেক বেশি, এটির উল্লেখ না করে এর অন্যান্য পরীক্ষার উপরও পার্শ্ব প্রতিক্রিয়া থাকতে পারে এবং ম্যানুয়াল সিঙ্ক্রোনাইজেশন ছাড়া সমান্তরাল পরীক্ষার রানগুলিতে ব্যবহার করা যাবে না (যেমন NameValueConnection
থ্রেড নিরাপদ নয়)।
এটি একটি স্থিতিশীল সম্পত্তি, এবং মূককে ম্যাক উদাহরণ পদ্ধতি বা ক্লাসগুলির জন্য ডিজাইন করা হয়েছে যা উত্তরাধিকারের মাধ্যমে উপহাস করা যায়। অন্য কথায়, মক আপনার এখানে কোনও সহায়ক হবে না।
উপহাসের পরিসংখ্যানগুলির জন্য, আমি মোলস নামে একটি সরঞ্জাম ব্যবহার করি যা বিনামূল্যে। অন্যান্য কাঠামো বিচ্ছিন্নকরণ সরঞ্জাম রয়েছে যেমন টাইপমক যা এটিও করতে পারে, যদিও আমি বিশ্বাস করি সেগুলি প্রদত্ত সরঞ্জাম are
যখন এটি স্ট্যাটিকস এবং টেস্টিংয়ের কথা আসে, তখন অন্য একটি বিকল্প হ'ল স্ট্যাটিক স্টেটটি নিজে তৈরি করা, যদিও এটি প্রায়শই সমস্যাযুক্ত হতে পারে (যেমন, আমি ভাবছিলাম এটি আপনার ক্ষেত্রে হবে)।
এবং, অবশেষে, যদি বিচ্ছিন্ন কাঠামো কোনও বিকল্প না হয় এবং আপনি এই পদ্ধতির প্রতি প্রতিশ্রুতিবদ্ধ হন, জোশুয়া দ্বারা উল্লিখিত উপদ্বীপটি একটি ভাল পদ্ধতির বা সাধারণভাবে এমন কোনও পদ্ধতির যেখানে আপনি ব্যবসায়ের যুক্তি থেকে দূরে থাকা ক্লায়েন্ট কোডকেই নির্ধারণ করেন যে আপনি পরীক্ষার জন্য ব্যবহার করছি।
আমি মনে করি আপনার নিজের অ্যাপ.config সরবরাহকারীর লেখা একটি সহজ কাজ এবং অন্য যে কোনও কিছু থেকে বেশি কার্যকর। বিশেষত আপনার শিমস ইত্যাদি কোনও জাল এড়ানো উচিত কারণ আপনি এগুলি ব্যবহার করার সাথে সাথে সম্পাদনা এবং চালিয়ে যাওয়া আর কাজ করে না works
আমি যে সরবরাহকারী ব্যবহার করি তারা এর মতো দেখতে:
ডিফল্টরূপে তারা মানগুলি পায় App.config
তবে ইউনিট পরীক্ষার জন্য আমি সমস্ত মানকে ওভাররাইড করতে এবং প্রতিটি পরীক্ষায় স্বাধীনভাবে ব্যবহার করতে পারি।
কোনও ইন্টারফেসের প্রয়োজন নেই বা বারবার এটি প্রয়োগ করা হবে। আমার কাছে একটি ইউটিলিটি রয়েছে এবং অনেকগুলি প্রকল্প এবং ইউনিট পরীক্ষায় এই ছোট সহায়কটি ব্যবহার করি।
public class AppConfigProvider
{
public AppConfigProvider()
{
ConnectionStrings = new ConnectionStringsProvider();
AppSettings = new AppSettingsProvider();
}
public ConnectionStringsProvider ConnectionStrings { get; private set; }
public AppSettingsProvider AppSettings { get; private set; }
}
public class ConnectionStringsProvider
{
private readonly Dictionary<string, string> _customValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
public string this[string key]
{
get
{
string customValue;
if (_customValues.TryGetValue(key, out customValue))
{
return customValue;
}
var connectionStringSettings = ConfigurationManager.ConnectionStrings[key];
return connectionStringSettings == null ? null : connectionStringSettings.ConnectionString;
}
}
public Dictionary<string, string> CustomValues { get { return _customValues; } }
}
public class AppSettingsProvider
{
private readonly Dictionary<string, string> _customValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
public string this[string key]
{
get
{
string customValue;
return _customValues.TryGetValue(key, out customValue) ? customValue : ConfigurationManager.AppSettings[key];
}
}
public Dictionary<string, string> CustomValues { get { return _customValues; } }
}
আপনার যা প্রয়োজন তা ঠিক করার বিষয়ে কীভাবে? কারণ, আমি ঠাট্টা করতে চাই না। নেট, আমি ...?
System.Configuration.ConfigurationManager.AppSettings["myKey"] = "myVal";
অ্যাপ্লিকেশনটি কেবল আপনার কী চায় তা কেবল এটিই দেখেছে তা নিশ্চিত করার জন্য আপনার সম্ভবত অ্যাপসেটিংগুলি আগেই পরিষ্কার করা উচিত।