2012-09-12 10 views
18

में केवल एक बार सेटअप कोड को चलाने के लिए मैं XUnit उपयोग करते हुए मेरे परीक्षण सेटअप करने के लिए कोशिश कर रहा हूँ। मुझे परीक्षण की फ़ोल्डर प्रारंभ में सभी छवियों को हटाने की आवश्यकता है, और फिर प्रत्येक विधि कुछ छवि आकार बदलती है और फ़ोल्डर के अपने आउटपुट की एक प्रति सहेजती है। फ़ोल्डर को केवल एक बार खाली किया जाना चाहिए, और फिर प्रत्येक विधि फ़ोल्डर में अपनी छवि को सहेज लेगी।कैसे एक xUnit.net परीक्षण

जब मैं IUseFixture<T> का उपयोग करता हूं, तो ClearVisualTestResultFolder फ़ंक्शन अभी भी प्रत्येक परीक्षण से पहले कहा जा रहा है, इसलिए मैं फ़ोल्डर में केवल एक छवि के साथ समाप्त होता हूं।

public class Fixture 
{ 
    public void Setup() 
    { 
     ImageHelperTest.ClearVisualTestResultFolder(); 
    } 
} 

public class ImageHelperTest : IUseFixture<EngDev.Test.Fixture> 
{ 
    public void SetFixture(EngDev.Test.Fixture data) 
    { 
     data.Setup(); 
    } 

    public static void ClearVisualTestResultFolder() 
    { 
     // Logic to clear folder 
    } 
} 

अगर मैं निर्माता में ClearVisualTestResultFolder शब्दों में कहें, यह भी एक बार हर परीक्षा पद्धति के लिए बुलाया जा रहा है। मुझे सभी टेस्ट विधियों को निष्पादित करने से पहले इसे चलाने की ज़रूरत है, मैं इसे कैसे प्राप्त कर सकता हूं?

अगर यह मायने रखती है, मैं ReSharper परीक्षण धावक का उपयोग करें।

उत्तर

25

इस xUnit discussion topic में मार्गदर्शन के बाद, ऐसा लगता है जैसे आप स्थिरता पर एक निर्माता को लागू करने के लिए और भी IDisposable लागू लेनी होगी।

डी:: \ XUnit> xunit.console.clr4

using System; 
using System.Diagnostics; 
using Xunit; 
using Xunit.Sdk; 

namespace xUnitSample 
{ 
    public class SomeFixture : IDisposable 
    { 
     public SomeFixture() 
     { 
      Console.WriteLine("SomeFixture ctor: This should only be run once"); 
     } 

     public void SomeMethod() 
     { 
      Console.WriteLine("SomeFixture::SomeMethod()"); 
     } 

     public void Dispose() 
     { 
      Console.WriteLine("SomeFixture: Disposing SomeFixture"); 
     } 
    } 

    public class TestSample : IUseFixture<SomeFixture>, IDisposable 
    { 
     public void SetFixture(SomeFixture data) 
     { 
      Console.WriteLine("TestSample::SetFixture(): Calling SomeMethod"); 
      data.SomeMethod(); 
     } 

     public TestSample() 
     { 
      Console.WriteLine("This should be run once before every test " + DateTime.Now.Ticks); 
     } 

     [Fact] 
     public void Test1() 
     { 
      Console.WriteLine("This is test one."); 
     } 

     [Fact] 
     public void Test2() 
     { 
      Console.WriteLine("This is test two."); 
     } 

     public void Dispose() 
     { 
      Console.WriteLine("Disposing"); 
     } 
    } 
} 

जब सांत्वना धावक से चल रहा है, तो आपको निम्न उत्पादन देखेंगे: यहाँ एक पूरा नमूना कि जिस तरह से आप चाहते हैं बर्ताव करता है .exe Test.dll/HTML foo.htm xUnit.net कंसोल परीक्षण धावक (64-बिट नेट 4.0.30319.17929) कॉपीराइट (सी) 2007-11 Microsoft Corporation।

xunit.dll: संस्करण 1.9.1.1600 टेस्ट विधानसभा: Test.dll

SomeFixture ctor: के 2 2

SomeFixture:: यह केवल एक बार चलाने की जानी चाहिए

परीक्षण पूर्ण SomeFixture

निपटान

2 कुल, 0 में विफल रहा है, 0 को छोड़ दिया, ले लिया 0.686 सेकंड

फिर, जब आप परीक्षण आउटपुट फ़ाइल foo.htm खोलते हैं, तो आप अन्य परीक्षण आउटपुट देखेंगे।

6

IUseFixture<T>.SetFixture प्रत्येक परीक्षा के लिए एक बार कहा जाता हो जाता है। स्थिरता केवल एक बार बनाई गई है।

दूसरे शब्दों में, यदि आप अपने SetFixture विधि में कुछ भी कर नहीं होना चाहिए, लेकिन आप के बजाय स्थिरता निर्माता में यह ट्रिगर किया जाना चाहिए।

एक बार सफाई के लिए, स्थिरता पर एक IDisposable.Dispose लागू (यह हालांकि इसकी आवश्यकता नहीं है)

ध्यान दें कि यह एक बुरा विचार है होना करने के लिए (यहां तक ​​कि संभावित) परीक्षण के बीच आदान-प्रदान राज्य। TemporaryDirectoryFixturelike this one का उपयोग करने के लिए सर्वश्रेष्ठ।

11

xUnit.net v1 में वर्ष IUseFixture<T> इंटरफ़ेस।एक्स दो नए इंटरफेस द्वारा प्रतिस्थापित किया गया है: IClassFixture<T> और ICollectionFixture<T>। में, आपके परीक्षणों में स्थिरता मूल्यों को इंजेक्शन करने के लिए तंत्र संपत्ति सेटर्स से कन्स्ट्रक्टर तर्कों में बदल गया है। कक्षा फिक्स्चर एक बार बनाए जाते हैं और उसी कक्षा (पुराने IUseFixture की तरह) में सभी परीक्षणों के बीच साझा किए जाते हैं। संग्रह फिक्स्चर समान तरीके से काम करते हैं, सिवाय इसके कि एक ही उदाहरण संग्रह में सभी परीक्षण के बीच एक उदाहरण साझा किया जाता है।

संबंधित मुद्दे