কোডটি ইউনিট পরীক্ষার অংশ হিসাবে চলছে কিনা তা নির্ধারণ করুন


105

আমার একটি ইউনিট পরীক্ষা (নুনিট) আছে। কল স্ট্যাকের নীচে থাকা অনেক স্তরগুলি যদি কোনও ইউনিট পরীক্ষার মাধ্যমে চলতে থাকে তবে কোনও পদ্ধতি ব্যর্থ হবে।

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

আমি নির্দিষ্ট পদ্ধতিগুলি সেটআপ করতে চাই না - এখানে অনেকগুলি স্তর রয়েছে এবং ইউনিট পরীক্ষা করার এটির একটি খারাপ উপায়।

পরিবর্তে আমি যা করতে চাই তা হ'ল কল স্ট্যাকের গভীরে এমন কিছু যুক্ত করা

#IF DEBUG // Unit tests only included in debug build
if (IsRunningInUnitTest)
   {
   // Do some setup to avoid error
   }
#endif

কিভাবে ইসআরুনিংআইইনউনিতটেষ্ট লিখবেন সে সম্পর্কে কোনও ধারণা?

পিএস আমি পুরোপুরি সচেতন যে এটি দুর্দান্ত নকশা নয় তবে আমি বিকল্পগুলির চেয়ে এটির চেয়ে ভাল মনে করি


5
আপনার প্রত্যক্ষ বা অপ্রত্যক্ষভাবে কোনও ইউনিট পরীক্ষায় তৃতীয় পক্ষের কোডটি পরীক্ষা করা উচিত নয়। তৃতীয় পক্ষের বাস্তবায়ন থেকে পরীক্ষার অধীনে আপনার নিজের পদ্ধতিটি পৃথক করা উচিত।
ক্রেগ স্টান্টজ

14
হ্যাঁ - আমি বুঝতে পারি - একটি ধারণার জগতে, তবে কখনও কখনও আমরা কিছু না সম্পর্কে কিছুটা বাস্তববাদী হতে পারি?
রায়ান

9
ক্রেগের মন্তব্যে ফিরে আসছেন - নিশ্চিত এটি সত্য নয়। যদি আমার পদ্ধতিটি একটি তৃতীয় পক্ষের লাইব্রেরির উপর নির্ভর করে নির্দিষ্টভাবে আচরণ করে তবে এটি কি পরীক্ষার অংশ হওয়া উচিত নয়? যদি তৃতীয় পক্ষের অ্যাপ পরিবর্তন হয় তবে আমি চাই আমার পরীক্ষাটি ব্যর্থ হয়। আপনি যদি তৃতীয় পক্ষের অ্যাপ্লিকেশনটি কীভাবে কাজ করে বলে মনে করেন তবে এটি কীভাবে বাস্তবে হয় না তার বিপরীতে যদি আপনার পরীক্ষাটি উপহাস করে থাকে using
রায়ান

2
রায়ান, আপনি তৃতীয় পক্ষের আচরণ সম্পর্কে অনুমানগুলি পরীক্ষা করতে পারেন, তবে এটি একটি পৃথক পরীক্ষা। বিচ্ছিন্নভাবে আপনার নিজের কোডটি পরীক্ষা করা দরকার।
ক্রেগ স্টান্টজ

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

উত্তর:


80

আমি এটি আগেও করেছি - এটি করার সময় আমার নাক চেপে ধরেছিল, তবে আমি এটি করেছি। বাস্তববাদ প্রতিবার কৌতুকবাদকে মারধর করে। অবশ্যই, যদি সেখানে হয় সুন্দর ভাবে আপনি এটা এড়ানোর জন্য refactor করতে পারেন যে মহান হতে হবে।

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


ইউনিটটেষ্টডেক্টর সম্পর্কে কোনও নমুনা? এবং এমএসটিস্টের জন্য অনুরূপ?
কিকিনেট

4
@ কিকিনেট: আমি মনে করি যে আমি কেবলমাত্র AppDomain.GetAssembliesপ্রাসঙ্গিক সমাবেশটি ব্যবহার করব এবং যাচাই করবো - এমএসটিস্টের জন্য আপনাকে কোন সম্মেলনগুলি বোঝা হচ্ছে তা দেখার প্রয়োজন হবে look উদাহরণস্বরূপ রায়ের উত্তর দেখুন।
জন স্কিটি

এটি আমার পক্ষে ভাল পন্থা নয়। আমি একটি কনসোল অ্যাপ্লিকেশন থেকে ইউনিট টেস্ট পদ্ধতিটি কল করছি এবং এটি এটি ইউনিট টেস্ট অ্যাপ মনে করে।
বিজান 14

1
@ বিজন: আমি পরামর্শ দিই যে আপনি তখন বরং বিশেষায়িত পরিস্থিতিতে রয়েছেন, এবং আপনার কাজের আরও সাধারণ উত্তর আশা করা উচিত নয়। আপনার সমস্ত নির্দিষ্ট প্রয়োজনীয়তার সাথে আপনি একটি নতুন প্রশ্ন জিজ্ঞাসা করতে চাইতে পারেন। (উদাহরণস্বরূপ "একটি কনসোল অ্যাপ্লিকেশন থেকে আপনার কোড কলিং" এবং "একটি পরীক্ষা রানার" এর মধ্যে পার্থক্য কী? আপনি কীভাবে আপনার কনসোল অ্যাপ্লিকেশন এবং অন্য কোনও কনসোল-ভিত্তিক পরীক্ষা রানার মধ্যে পার্থক্য করতে চান?)
জন স্কিট

74

জনের ধারণা গ্রহণ করা আমি এটাই সামনে এলাম -

using System;
using System.Reflection;

/// <summary>
/// Detect if we are running as part of a nUnit unit test.
/// This is DIRTY and should only be used if absolutely necessary 
/// as its usually a sign of bad design.
/// </summary>    
static class UnitTestDetector
{

    private static bool _runningFromNUnit = false;      

    static UnitTestDetector()
    {
        foreach (Assembly assem in AppDomain.CurrentDomain.GetAssemblies())
        {
            // Can't do something like this as it will load the nUnit assembly
            // if (assem == typeof(NUnit.Framework.Assert))

            if (assem.FullName.ToLowerInvariant().StartsWith("nunit.framework"))
            {
                _runningFromNUnit = true;
                break;
            }
        }
    }

    public static bool IsRunningFromNUnit
    {
        get { return _runningFromNUnit; }
    }
}

পিছনে পাইপ ডাউন আমরা সমস্ত বড় ছেলেদের যখন আমরা এমন কিছু করছি যা আমাদের সম্ভবত করা উচিত নয় তখন তা সনাক্ত করা যায়;)


2
+1 ভাল উত্তর। এই বেশ একটু সরলীকৃত করা যেতে পারে যদিও, নীচে দেখুন: stackoverflow.com/a/30356080/184528
cdiggins

আমি যে বিশেষ প্রকল্পটির জন্য এটি লিখেছিলাম তা ছিল (এবং এখনও রয়েছে!) নেট 2.0 তাই কোনও লিঙ্ক নেই।
রায়ান

এই ব্যবহারটি আমার পক্ষে কাজ করে তবে মনে হয় যেহেতু সমাবেশের নামটি পরিবর্তিত হয়েছে। আমি স্যুইচ Kiquenet এর সমাধান
The_Black_Smurf


আমার জন্য কাজ করে, আমাকে প্রায় রেট সহ নেট কোর 3 বাগটি হ্যাক করতে হবে যা কেবল ইউনিট পরীক্ষায় ঘটে।
jjxtra

62

রায়ান এর উত্তর থেকে অভিযোজিত। এটি একটি এমএস ইউনিট পরীক্ষার কাঠামোর জন্য।

আমার এটির কারণ হ'ল কারণ আমি ত্রুটিগুলিতে একটি বার্তাবক্স দেখি। তবে আমার ইউনিট পরীক্ষাগুলি ত্রুটি পরিচালনার কোডও পরীক্ষা করে এবং ইউনিট পরীক্ষা চালানোর সময় আমি কোনও বার্তাবক্স পপআপ করতে চাই না।

/// <summary>
/// Detects if we are running inside a unit test.
/// </summary>
public static class UnitTestDetector
{
    static UnitTestDetector()
    {
        string testAssemblyName = "Microsoft.VisualStudio.QualityTools.UnitTestFramework";
        UnitTestDetector.IsInUnitTest = AppDomain.CurrentDomain.GetAssemblies()
            .Any(a => a.FullName.StartsWith(testAssemblyName));
    }

    public static bool IsInUnitTest { get; private set; }
}

এবং এটির জন্য এখানে একটি ইউনিট পরীক্ষা রয়েছে:

    [TestMethod]
    public void IsInUnitTest()
    {
        Assert.IsTrue(UnitTestDetector.IsInUnitTest, 
            "Should detect that we are running inside a unit test."); // lol
    }

8
আমার আরও ভাল উপায় আছে যা আপনার মেসেজবক্সের সমস্যা সমাধান করে এবং এই হ্যাকটিকে শূন্য করে এবং আরও ইউনিট পরীক্ষার কেস সরবরাহ করে। আমি এমন একটি ক্লাস ব্যবহার করি যা একটি ইন্টারফেস প্রয়োগ করে আমি আইকোমনডায়ালগগুলি বলি। বাস্তবায়ন শ্রেণীর সমস্ত পপ আপ ডায়লগ প্রদর্শিত হয় (বার্তাবক্স, ফাইল ডায়লগ, রঙ চয়নকারী, ডাটাবেস সংযোগ ডায়ালগ ইত্যাদি)। যে ক্লাসে বার্তা বাক্সগুলি প্রদর্শন করা দরকার তারা আইকোমনডায়াগলোগগুলি একটি নির্মাতা পরামিতি হিসাবে গ্রহণ করে যা আমরা তার পরে ইউনিট পরীক্ষায় উপহাস করতে পারি। বোনাস: আপনি প্রত্যাশিত মেসেজবক্স কলগুলিতে দৃsert়তা দিতে পারেন।
টনি ও'হাগান

1
টনি, ভাল ধারণা। এটি স্পষ্টভাবে এটি করার সর্বোত্তম উপায়। আমি জানি না আমি তখন কী ভাবছিলাম। আমি মনে করি নির্ভরতা ইনজেকশন আমার কাছে তখনও নতুন ছিল।
ড্যান-জিএফ

3
গুরুতরভাবে, লোকেরা, নির্ভরতা ইনজেকশন সম্পর্কে শিখুন এবং দ্বিতীয়ত, মক অবজেক্টগুলি। নির্ভরতা ইনজেকশন আপনার প্রোগ্রামিংয়ে বিপ্লব ঘটাবে।
ড্যান-জিএফ

2
আমি ইউনিটস্টেস্টডেক্টর বাস্তবায়ন করব s আইসইউউনিটটেষ্টকে "সত্য সত্য" হিসাবে চিহ্নিত করব এবং আপনার ইউনিট পরীক্ষাটি পাস হবে will ;) সেই এক মজার বিষয় যা ইউনিট পরীক্ষা করা অসম্ভব বলে মনে হয়।
সমীর আদ্রা

1
মাইক্রোসফ্ট.ভিজুয়ালস্টুডিও.কুয়েলটিসুলস.উনাইটটেষ্টফ্রেমওয়ার্ক আমার পক্ষে আর কাজ করে না। এটিকে মাইক্রোসফ্ট-ভিজ্যুয়াল স্টুডিও.টেষ্টপ্লেটফর্ম.টেষ্টফ্রেমওয়ার্ক - এ আবার কাজ করে।
আলেকজান্ডার

21

রায়ান এর সমাধান সরল করে আপনি কেবল কোনও শ্রেণিতে নিম্নলিখিত স্থিতিশীল সম্পত্তি যুক্ত করতে পারেন:

    public static readonly bool IsRunningFromNUnit = 
        AppDomain.CurrentDomain.GetAssemblies().Any(
            a => a.FullName.ToLowerInvariant().StartsWith("nunit.framework"));

2
ড্যান-জিএফ-এর উত্তরের মতো অনেক সুন্দর (যদিও এটি ভিএস টুলসেট খুঁজছিল, নুনিট নয়)।
রায়ান

18

আমি লম্বা হিসাবে অনুরূপ পদ্ধতির ব্যবহার

এটি মূল কোড যা সহজেই ক্যাচিং অন্তর্ভুক্ত করতে সংশোধন করা যেতে পারে। আর একটি ভাল ধারণা হ'ল একটি সেটর যুক্ত করা IsRunningInUnitTestএবং কোডগুলি UnitTestDetector.IsRunningInUnitTest = falseকার্যকর করা এড়ানোর জন্য আপনার প্রকল্পগুলির প্রধান প্রবেশ পয়েন্টে কল করা।

public static class UnitTestDetector
{
    public static readonly HashSet<string> UnitTestAttributes = new HashSet<string> 
    {
        "Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute",
        "NUnit.Framework.TestFixtureAttribute",
    };
    public static bool IsRunningInUnitTest
    {
        get
        {
            foreach (var f in new StackTrace().GetFrames())
                if (f.GetMethod().DeclaringType.GetCustomAttributes(false).Any(x => UnitTestAttributes.Contains(x.GetType().FullName)))
                    return true;
            return false;
        }
    }
}

আমি উচ্চতর ভোটের উত্তরের চেয়ে এই পদ্ধতির পছন্দ করি। আমি মনে করি এটি নিরাপদ বলে মনে করি না যে ইউনিট পরীক্ষা সমাবেশগুলি কেবলমাত্র ইউনিট পরীক্ষার সময় লোড হবে এবং প্রক্রিয়াটির নামটি বিকাশকারী থেকে বিকাশকারীতেও পরিবর্তিত হতে পারে (উদাঃ কিছু লোক আর # টেস্ট রানার ব্যবহার করে)।
EM0

এই পদ্ধতির কাজ করবে তবে প্রতিবার ইসআরুনিংআইইনউনিতটেষ্ট গেটার বলা হলে সেই বৈশিষ্ট্যগুলি অনুসন্ধান করবে । এমন কিছু ঘটনা ঘটতে পারে যা এটি কার্য সম্পাদনকে প্রভাবিত করতে পারে। পরীক্ষা করা হচ্ছে AssemblyName সস্তা কারণ এটি শুধুমাত্র একবার শেষ হবে। পাবলিক সেটারের সাথে ধারণাটি ভাল তবে এই ক্ষেত্রে ইউনিটটেষ্টডেক্টর শ্রেণিকে একটি ভাগ করা সমাবেশে রাখা উচিত।
সার্জি

13

বর্তমান কার্যকর প্রক্রিয়া নাম পরীক্ষা করা দরকারী হতে পারে:

public static bool UnitTestMode
{
    get 
    { 
        string processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;

        return processName == "VSTestHost"
                || processName.StartsWith("vstest.executionengine") //it can be vstest.executionengine.x86 or vstest.executionengine.x86.clr20
                || processName.StartsWith("QTAgent");   //QTAgent32 or QTAgent32_35
    }
}

এবং এই ফাংশনটি ইউনিটটেস্ট দ্বারাও পরীক্ষা করা উচিত:

[TestClass]
public class TestUnittestRunning
{
    [TestMethod]
    public void UnitTestRunningTest()
    {
        Assert.IsTrue(MyTools.UnitTestMode);
    }
}

তথ্যসূত্র: http :
//social.msdn.mic Microsoft.com/ Forums/ en- US/ csharplanguage/ thread/11e68468- c95e- 4c43- b02b- 7045a52b407e/ এ ম্যাথু ওয়াটসন


|| processName.StartsWith("testhost") // testhost.x86ভিএস 2019 এর জন্য
কিকিনিট

9

পরীক্ষা মোডে, Assembly.GetEntryAssembly()বলে মনে হচ্ছে null

#IF DEBUG // Unit tests only included in debug build 
  if (Assembly.GetEntryAssembly() == null)    
  {
    // Do some setup to avoid error    
  }
#endif 

মনে রাখবেন যদি Assembly.GetEntryAssembly()হয় null, Assembly.GetExecutingAssembly()নয়।

ডকুমেন্টেশন বলেছেন: GetEntryAssemblyপদ্ধতি ফিরে আসতে পারেন nullযখন সমাবেশ পরিচালিত একটি একটি অপরিচালিত অ্যাপ্লিকেশন থেকে লোড হয়েছে।


8

প্রকল্পের কোথাও পরীক্ষা করা হচ্ছে:

public static class Startup
{
    public static bool IsRunningInUnitTest { get; set; }
}

আপনার ইউনিট পরীক্ষা প্রকল্পের কোথাও:

[TestClass]
public static class AssemblyInitializer
{
    [AssemblyInitialize]
    public static void Initialize(TestContext context)
    {
        Startup.IsRunningInUnitTest = true;
    }
}

মার্জিত, না। কিন্তু সোজা এবং দ্রুত। AssemblyInitializerএমএস টেস্টের জন্য। আমি অন্যান্য পরীক্ষার ফ্রেমওয়ার্কগুলির সমতুল্যতা আশা করব।


1
আপনি যে কোডটি পরীক্ষা করছেন সেটি যদি অতিরিক্ত অ্যাপডোমাইন তৈরি IsRunningInUnitTestকরে তবে সেই অ্যাপডোমেনগুলিতে সত্য হয়ে যায় না।
এডওয়ার্ড ব্রেই

তবে এটি সহজেই কোনও ভাগ করা অ্যাসেমব্লি যুক্ত করে অথবা প্রতিটি ডোমেনে ইসরুনিংআইইনউনিতটেষ্ট ঘোষণা করে সমাধান করা যেতে পারে ।
সের্গেই

3

আমি কেবল এটি ব্যবহার করি যুক্তি এড়িয়ে যাওয়ার জন্য যা প্রারম্ভকালে লগ 4 নেট-এ সমস্ত ট্রেস অ্যাপেন্ডারকে অক্ষম করে যখন কোনও ডিবাগার সংযুক্ত থাকে না। এটি ইউনিট টেস্টগুলিকে নন-ডিবাগ মোডে চলাকালীন পুনঃভাগের ফলাফল উইন্ডোতে লগ করতে সহায়তা করে।

এই ফাংশনটি ব্যবহার করার পদ্ধতিটি হয় অ্যাপ্লিকেশন শুরু করার সময় বা পরীক্ষার ফিক্সিংয়ের সময় ডাকা হয়।

এটি রায়ানের পোস্টের মতোই তবে লিনকিউ ব্যবহার করে, সিস্টেমটি ড্রপ করে efনির্ধারণের প্রয়োজনীয়তাটি, ফলাফলটি ক্যাশে করে না এবং (দুর্ঘটনাজনিত) অপব্যবহার রোধ করার জন্য ব্যক্তিগত।

    private static bool IsNUnitRunning()
    {
        return AppDomain.CurrentDomain.GetAssemblies().Any(assembly => assembly.FullName.ToLowerInvariant().StartsWith("nunit.framework"));
    }

3

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

নুনিট বিধানসভা পরীক্ষা করার পরিবর্তে আমরা নুনিত এপিকে জিজ্ঞাসা করতে পারি যে এখন বা না পরীক্ষার অধীনে কোড রয়েছে তা পরীক্ষা করতে।

using NUnit.Framework;

// ...

if (TestContext.CurrentContext != null)
{
    // nunit test detected
    // Do some setup to avoid error
}

সম্পাদনা:

সাবধান যে টেস্টকন্টেক্সট প্রয়োজন হলে স্বয়ংক্রিয়ভাবে উত্পন্ন হতে পারে


2
এখানে শুধু কোড ডাম্প করবেন না। এটি কী করে তা ব্যাখ্যা করুন।
nkr

2

কেবল এটি ব্যবহার করুন:

AppDomain.CurrentDomain.IsDefaultAppDomain()

পরীক্ষা মোডে, এটি মিথ্যা ফিরে আসবে।


1

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

internal abstract class TestModeDetector
{
    internal abstract bool RunningInUnitTest();

    internal static TestModeDetector GetInstance()
    {
    #if DEBUG
        return new DebugImplementation();
    #else
        return new ReleaseImplementation();
    #endif
    }

    private class ReleaseImplementation : TestModeDetector
    {
        internal override bool RunningInUnitTest()
        {
            return false;
        }
    }

    private class DebugImplementation : TestModeDetector
    {
        private Mode mode_;

        internal override bool RunningInUnitTest()
        {
            if (mode_ == Mode.Unknown)
            {
                mode_ = DetectMode();
            }

            return mode_ == Mode.Test;
        }

        private Mode DetectMode()
        {
            return HasUnitTestInStack(new StackTrace()) ? Mode.Test : Mode.Regular;
        }

        private static bool HasUnitTestInStack(StackTrace callStack)
        {
            return GetStackFrames(callStack).SelectMany(stackFrame => stackFrame.GetMethod().GetCustomAttributes(false)).Any(NunitAttribute);
        }

        private static IEnumerable<StackFrame> GetStackFrames(StackTrace callStack)
        {
            return callStack.GetFrames() ?? new StackFrame[0];
        }

        private static bool NunitAttribute(object attr)
        {
            var type = attr.GetType();
            if (type.FullName != null)
            {
                return type.FullName.StartsWith("nunit.framework", StringComparison.OrdinalIgnoreCase);
            }
            return false;
        }

        private enum Mode
        {
            Unknown,
            Test,
            Regular
        }

রিলিজ সংস্করণটি সাধারণভাবে খারাপ ধারণা হতে শিপিংয়ের সময় আমি ডিবাগ সংস্করণটি পরীক্ষা করার ধারণাটি পাই।
প্যাট্রিক এম

1

একটি যাদুমন্ত্র মত কাজ করে

if (AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.FullName.ToLowerInvariant().StartsWith("nunit.framework")) != null)
{
    fileName = @"C:\Users\blabla\xxx.txt";
}
else
{
    var sfd = new SaveFileDialog
    {     ...     };
    var dialogResult = sfd.ShowDialog();
    if (dialogResult != DialogResult.OK)
        return;
    fileName = sfd.FileName;
}


1

ইউনিট পরীক্ষা প্রয়োগের এন্ট্রি পয়েন্ট এড়িয়ে যাবে। কমপক্ষে wpf, winforms এবং কনসোল অ্যাপ্লিকেশন জন্যmain() হচ্ছে না।

যদি রান- টাইমের চেয়ে মূল পদ্ধতিটিকে ডাকা হয় , অন্যথায় আমরা ইউনিট পরীক্ষা মোডে থাকি :

public static bool IsUnitTest { get; private set; } = true;

[STAThread]
public static void main()
{
    IsUnitTest = false;
    ...
}

0

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

if (SynchronizationContext.Current == null)
{
    // code running in a background thread or from within a unit test
    DoSomething();
}
else
{
    // code running in the main thread or any other thread where
    // a SynchronizationContext has been set with
    // SynchronizationContext.SetSynchronizationContext(synchronizationContext);
    DoSomethingAsync();
}

আমি এটি কোডের জন্য ব্যবহার করছি fire and forgot একটি গি অ্যাপ্লিকেশন করতে চাইছি তবে ইউনিট পরীক্ষাগুলিতে আমার একটি দৃ as়তার জন্য গণিত ফলাফলের প্রয়োজন হতে পারে এবং আমি একাধিক থ্রেড চলমান নিয়ে গোলযোগ করতে চাই না।

এমএসটিস্টের জন্য কাজ করে। এই সুবিধাটি যে আমার কোডটি নিজেই পরীক্ষার কাঠামোটি খতিয়ে দেখার দরকার নেই এবং যদি সত্যই একটি নির্দিষ্ট পরীক্ষায় অ্যাসিঙ্ক আচরণের প্রয়োজন হয় তবে আমি নিজের সিঙ্ক্রোনাইজেশন কনটেক্সট সেট করতে পারি।

সচেতন থাকুন যে Determine if code is running as part of a unit testওপি কর্তৃক অনুরোধ করা এটি নির্ভরযোগ্য পদ্ধতি নয় কারণ কোডটি কোনও থ্রেডের মধ্যে চলতে পারে তবে নির্দিষ্ট পরিস্থিতিতে এটির একটি ভাল সমাধান হতে পারে (এছাড়াও: আমি যদি ইতিমধ্যে একটি পটভূমি থ্রেড থেকে চালাচ্ছি তবে এটি প্রয়োজনীয় নাও হতে পারে একটি নতুন শুরু করতে)।


0

ইউনিট পরীক্ষকের অধীনে চলাকালীন অ্যাপ্লিকেশন.কন্টেনটি শূন্য। কমপক্ষে আমার ডাব্লুপিএফ অ্যাপ্লিকেশনটির জন্য এমএস ইউনিট পরীক্ষক ব্যবহার করুন। প্রয়োজনে এটি করা সহজ পরীক্ষা। এছাড়াও, অ্যাপ্লিকেশনটি ব্যবহার করার সময় আপনার মনে রাখা উচিত your আপনার কোডটিতে বর্তমান।


0

আমরা কোনও ইউনিট পরীক্ষায় আছি কিনা তা পরীক্ষা করার জন্য আমি আমার কোডটিতে নিম্নলিখিতটি ভিবিতে ব্যবহার করেছি। স্পষ্টতই আমি পরীক্ষাটি ওয়ার্ড খুলতে চাইনি

    If Not Application.ProductName.ToLower().Contains("test") then
        ' Do something 
    End If

0

প্রতিবিম্ব এবং এই জাতীয় কিছু ব্যবহার সম্পর্কে কীভাবে:

var underTest = সমাবেশ.GetCallingAsorses ()! = টাইপফ (মেইনফর্ম) .অসাধারণ;

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


-3

আপনি যখন ক্লাস পরীক্ষা করছেন তখন একটি খুব সহজ সমাধান রয়েছে ...

আপনি যে শ্রেণীর সম্পত্তি হিসাবে যাচ্ছেন তার কেবল শ্রেণিটি দিন:

// For testing purposes to avoid running certain code in unit tests.
public bool thisIsUnitTest { get; set; }

এখন আপনার ইউনিট পরীক্ষাটি "thisIsUnitTest" বুলেয়ানকে সত্যতে সেট করতে পারে, তাই আপনি যে কোডটি এড়িয়ে যেতে চান তাতে যুক্ত করুন:

   if (thisIsUnitTest)
   {
       return;
   } 

এটি সমাবেশগুলি পরিদর্শন করার চেয়ে সহজ এবং দ্রুত। রুবি অন রেলগুলির কথা মনে করিয়ে দেয় যেখানে আপনি টেস্ট পরিবেশে আছেন কিনা তা দেখতে আপনি চাইবেন।


1
আমি মনে করি আপনি এখানে নিচে ভোট পেয়েছিলেন কারণ আপনি ক্লাসের আচরণটি সংশোধন করার জন্য নিজেই পরীক্ষার উপর নির্ভর করছেন।
রিগ্রার্ড স্টেইন

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