2011-03-03 6 views
5

मैं इस तरह परीक्षण लिखने के लिए सक्षम होने के लिए चाहते हैं:मैं specflow को दिनांक/समय के साथ अच्छी तरह से सामना कैसे कर सकता हूं?

Background: 
    Given a user signs up for a 30 day account 

Scenario: access before expiry 
    When they login in 29 days 
    Then they will be let in 

Scenario: access after expiry 
    When they login in 31 days 
    Then they will be asked to renew 

Scenario: access after acounnt deleted 
    When they login in 2 years time 
    Then they will be asked to register for a new account 

मैं परीक्षणों के specflow पक्ष कैसे करते हैं?

संपादित करें: कैसे एक ही कदम परिभाषाओं दोनों "31 दिनों" और "2 साल के समय"

उत्तर

1

मुझे लगता है कि आप StepArgumentTransformation की तलाश में हो सकता है।

'31 दिनों में' के साथ सामना करने के लिए, डॉक्स यह तुम्हारे लिए है:

[Binding] 
public class Transforms 
{ 
    [StepArgumentTransformation(@"in (\d+) days?")] 
    public DateTime InXDaysTransform(int days) 
    { 
     return DateTime.Today.AddDays(days); 
    } 
} 

और के लिए, पैटर्न आप देख सकते हैं '2 साल में' ...

[StepArgumentTransformation(@"in (\d+) years?")] 
    public DateTime InXYearsTransform(int years) 
    { 
     return DateTime.Today.AddYears(years); 
    } 
+0

मुझे लगता है कि इस प्रश्न से पूछने के कुछ समय बाद StepArgumentTransformation को स्पेकफ़्लो में जोड़ा गया था .... –

+0

आह, सच। यह अभी भी एक [संबंधित प्रश्न] (http://stackoverflow.com/questions/40553847/specflow-step-argument-transformation-on-table-cell-contents-with-createinstance) की खोज में आया है, इसलिए दूसरों के लिए ' खातिर... –

3

इस .फ़ीचर फ़ाइल का निर्माण परीक्षण के लिए पीछे एक कोड पैदा करेगा के साथ सामना कर सकते हैं। फिर आपको प्रत्येक चरण को एक विधि में तार करने की आवश्यकता है। ऐसा करने का सबसे आसान तरीका है,

1: परीक्षण डीबग करें, परीक्षण असुविधाजनक के रूप में विफल हो जाएगा। टेस्ट रन परिणाम देखकर specflow आपको इस परीक्षण के लिए टेम्पलेट जोड़कर मदद करता है। त्रुटि संदेश इस तरह की कुछ दिखाई देगा

Assert.Inconclusive विफल। एक या अधिक चरणों के लिए कोई मिलान चरण परिभाषा नहीं मिली।

[Binding] 
public class StepDefinition1 
{ 
    [Given(@"a user signs up for a 30 day account")] 
    public void GivenAUserSignsUpForA30DayAccount() 
    { 
    } 

    [When(@"they login in 29 days")] 
    public void WhenTheyLoginIn29Days() 
    { 
     ScenarioContext.Current.Pending(); 
    } 

    [Then(@"they will be let in")] 
    public void ThenTheyWillBeLetIn() 
    { 
     ScenarioContext.Current.Pending(); 
    } 
} 

2: एक नया specflow कदम परिभाषा फ़ाइल, जो मूल रूप से सिर्फ इकाई परीक्षण वर्ग specflow विशेषताओं के साथ आबादी है में इस कॉपी करें। अब कुछ युक्तियां हैं जो आप मदद करने के लिए कर सकते हैं। GivenAUserSignsUpForA30DayAccount विधि में मैं एक उपयोगकर्ता बनाउंगा जिसका परीक्षण उस परीक्षण में किया जाएगा जिसमें 30 दिन का परीक्षण खाता है। एक निजी सदस्य यहां ठीक काम करेगा ताकि आप उन्हें विधियों के बीच एक्सेस कर सकें, लेकिन यह केवल तभी काम करता है जब सभी विधियां एक ही कक्षा में हों। यदि आप कई विशेषताओं/कक्षाओं के बीच विधियों का पुन: उपयोग करने का प्रयास करते हैं तो आपको अपनी ऑब्जेक्ट को परिदृश्यकोन्टेक्स्ट

3 में सहेजने की आवश्यकता होगी: जब specflow परीक्षण चलता है तो यह एक विधि की तलाश करता है जिसमें एक ही स्ट्रिंग के साथ मिलान विशेषता होती है। यहां एक चाल यह है कि आप विधि विशेषता में जंगली कार्ड का उपयोग करके विधि में पैरामीटर पास कर सकते हैं। 2 अलग-अलग फ़ाइल कार्ड

(। *) का अर्थ है कि आप उस विधि (\ d +) के लिए एक स्ट्रिंग पास कर रहे हैं जिसका अर्थ है कि आप उस विधि के लिए एक int पास कर रहे हैं।

क्योंकि आपकी जब विधि सामान्य है तो आप इसे इस तरह के पैरामीटर के साथ पुन: उपयोग कर सकते हैं।

[When(@"they login in (\d+) days")] 
    public void WhenTheyLoginInDays(int daysRemaining) 
    { 
     Account.DaysRemaining = daysRemaining; 
    } 

4: आखिरकार अपनी आवेषण को फिर विधि में जोड़ें ताकि अंत परिणाम ऐसा कुछ दिख सके। (ध्यान दें कि व्यक्तिगत रूप से मैं सुविधा एक सा के शब्दों पुनर्गठन और इसे पारित करेंगे अपेक्षित परिणाम इस तरह से परीक्षण तर्क मेरी उदाहरण के रूप में के रूप में बुरा नहीं है, परिदृश्य डेटा संचालित परीक्षण के लिए रूपरेखा पर देखने के)

[Binding] 
public class StepDefinition1 
{ 
    UserAccount user; 

    [Given(@"a user signs up for a 30 day account")] 
    public void GivenAUserSignsUpForA30DayAccount() 
    { 
     user = AccountController.CreateNewUser("bob", "password", AccountType.Trial); 
    } 

    [When(@"they login in (\d+) days")] 
    public void WhenTheyLoginInDays(int daysRemaining) 
    { 
     Account.DaysRemaining = daysRemaining; 
    } 

    [Then(@"they will (.*)")] 
    public void ThenTheyWillBeLetIn(string expected) 
    { 
     //check to see which test we are doing and then assert to see the expected result. 
     if(string.Compare(expected, "be let in", true) 
      Assert.AreEqual(LoginResult.Passed, LoginService.Login); 
     if(string.Compare(expected, "be asked to renew", true) 
      Assert.AreEqual(LoginResult.Passed, LoginService.Login); 

    } 
} 
+0

धन्यवाद गेटेट उत्तर के लिए, हालांकि मैं अपने प्रश्न के एक हिस्से से चूक गया कि अब मैंने कोरक्टेड किया है - पदों को स्थानांतरित करने के लिए खेद है! E.g "31 दिनों" और "2 साल के समय" दोनों के साथ एक ही चरण परिभाषा का सामना कैसे किया जा सकता है? –

3

मैं सापेक्ष स्पेकफ़्लो में दिनांक और समय के साथ सामना करने के तरीके के साथ एक समान समस्या का सामना करना पड़ा, और विनिर्देशों के भीतर अस्पष्ट दिनांक का समर्थन करके इसका संपर्क किया। मैं इस सवाल का जवाब से कोड का इस्तेमाल किया: Fuzzy Date Time Picker Control in C# .NET? है, जो आप को व्यक्त इस प्रकार है कि आप क्या चाहते हैं जाएगा:

 
[When(@"they login in the (.*)")] 
public void WhenTheyLoginIn(string loginDateTimeString) 
{ 
    DateTime loginDateTime = FuzzyDateTime.Parse(loginDateTimeString); 

    // TODO: Use loginDateTime 
} 

आप वाक्य रचना पसंद नहीं है:

 
Background: 
    Given a user signs up for a 30 day account 

Scenario: access before expiry 
    When they login in the next 29 days 
    Then they will be let in 

Scenario: access after expiry 
    When they login in the next 31 days 
    Then they will be asked to renew 

Scenario: access after account deleted 
    When they login in the next 2 years 
    Then they will be asked to register for a new account 
जैसे एक कदम परिभाषा के साथ

अस्पष्ट तिथियों के लिए, आप सूट करने के लिए FuzzyDateTime कोड में नियमित अभिव्यक्तियों को संशोधित कर सकते हैं।

1
> how can the same step definitions cope with both "31 days" and "2 years time" 

अपने नियमों workingday, क्रिसमस, सप्ताहांत के लिए कोई विशेष हैंडलिंग की जरूरत है, ... आप @ Nitro52-s जवाब देने के लिए संशोधित कर सकते हैं:

[When(@"they login in (\d+) days")] 
public void WhenTheyLoginInDays(int daysRemaining) 
{ 
    Account.RegristrationDate = DateTime.ToDay().SubtractDays(daysRemaining); 
    Account.VerificationDate = DateTime.ToDay();  
} 

शायद तुम भी परिदृश्यों को पुन: तैयार बारे में सोच सकते इस

Scenario: access before expiry 
    When they login on '2010-01-01' 
    And TodayIs '2010-01-29' 
    Then they will be let in 
-2

तरह Moles उपयोग करने का प्रयास और DateTime.Now ठूंठ एक ही तिथि हर वापस जाने के लिए। मोल्स की सबसे अच्छी सुविधाओं में से एक है किसी भी चीज़ के पास डांग को एक रनटाइम प्रतिनिधि में बदलने की क्षमता है जिसे आप अलग कर सकते हैं। एकमात्र कमी यह है कि यह आपके द्वारा उठाए गए कार्यान्वयन (स्टेब्ड बनाम मोल्ड) के आधार पर धीमी गति से चल सकता है। मैं बस इसमें डुबकी शुरू कर रहा हूं इसलिए नमक के अनाज के साथ मेरा सुझाव लें।

1

मुझे पता है कि मैंने लंबे समय से इसके साथ संघर्ष किया है। मेरे मौजूदा कोड को बदलने में कुछ समय लगा, लेकिन डेटटाइम के सभी संदर्भों को मारना.अब और उन्हें एक इंटरफेस के साथ बदलना जो मैं कर सकता था, मैक ने परीक्षण करने के लिए सब कुछ दस लाख बार आसान बना दिया है (और बाद में बदलना)। मैंने एक IDateTimeService बनाई है जिसमें एक विधि "GetCurrent()" है। अब मेरे सभी दिए गए कदम कह सकते हैं:

Given the current date is '2/4/12' 
And the user's account was created on '1/24/12' 

तब मैं रेंज की जांच बहुत आसान कर सकता हूं।

आज की तारीख के लिए कदम लगता है:

[Given(@"Given the current date is '(.*)'")] 
public void GivenTheCurrentDateIs(string date) 
{ 
    var dateServiceMock = new Mock<IDateTimeService>(); 
    dateServiceMock.Setup(ds => ds.GetCurrent()).Returns(DateTime.Parse(date)); 
    ScenarioContext.Current.Add("dateService", dateServiceMock); 
} 
संबंधित मुद्दे

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