سؤال

أريد إعادة استخدام بعض خطوات الخيار ولكن لا يمكن أن يبدو أنه يجد الطريق الصحيح.

أريد أن أكتب خطوة مثل:

Given /^I login with (.*) credentials$/ |type|
  # do stuff with type being one of "invalid" or "valid"
end

ولكن بعد ذلك، لديك خطوة أخرى مثل:

Given /^I login successfully$
  # call "Given I login with valid credentials"
end

لذلك في اختبار مصادقة المستخدم، يمكنني استخدام السابق، لكن معظم الأماكن الأخرى، يمكنني استخدام الأخير، وليس في الواقع لإعادة توضيح الرمز.

هل هناك طريقة للاتصال بهذه الخطوة الأخرى، أو هل وضعت للتو من المنطق بطريقة مساعد، وسيلة دعوة المذكورة من كل مهمة (أساسا استخراج طريقة إعادة صياغة، والتي، بعد قراءة سؤالي تجعلني أعتقد أن هذه في الواقع أفضل طريقة على أي حال)؟

هل كانت مفيدة؟

المحلول

تحديث: تم إهمال الطريقة الموضحة أدناه. تبدو الطريقة الموصى بها للاتصال بخطوة من داخل خطوة أخرى الآن:

Given /^I login successfully$/
    step "I login with valid credentials" 
end 

الطريقة القديمة المهملة (للرجوع إليها):

يمكنك الاتصال بخطوات من خطوات أخرى مثل هذا:

Given /^I login successfully$/
  Given "I login with valid credentials"
  Then "I should be logged in"
end

إذا كانت جميع السيناريوهات داخل ميزة تتطلب هذا (أو خطوات أخرى)، فيمكنك أيضا إضافة خلفية إلى كل ميزات، مع الخطوات الشائعة، مثل ذلك:

Background:
  Given I log in with valid credentials

Scenario: Change my password
  Given I am on the account page

نصائح أخرى

لاحظ أن الأسلوب الخاص بالاتصال بالاتصال الخطوات في الخطوات قد تغير في الإصدارات الحديثة من الخيار، والتي سترى ما إذا كنت تحصل على خطأ مثل "تحذير": استخدام "معين / عند / بعد ذلك" يتم إهمال تعريفات الخطوة، واستخدام "الخطوة" إلى استدعاء الخطوات الأخرى بدلا من ذلك: / Path/to/step_definitions/foo_steps.rb: 631: في "كتلة" ". انظر الخيار ويكي للتفاصيل.

جوهر التغيير هو أنه يجب عليك الآن استخدام step أو steps طرق.

When /^I make all my stuff shiny$/
  step "I polish my first thing"
end

When /^I make all my stuff shiny$/
  steps %Q{
    When I polish my first thing
    When I shine my second thing
  }
end

تتطلب الخطوات من تعريفات الخطوة هي ممارسة سيئة بعض العيوب:

  1. إذا فشل السيناريو، وهناك دعوات خطوة متداخلة، ستحصل على آخر تعريف خطوة تم استدعاء فقط في تتبع المكدس. قد يكون من الصعب العثور عليها من أي مكان تم استدعاءه الأخير
  2. دعوة إلى StepDEF أصعب في بعض الأحيان العثور على طريقة Ruby
  3. طرق روبي تعطيك قوة أكثر من الخطوات من الخطوات من الخطوة

aslak hellesøy. توصي لاستخراج الإجراءات الشعبية ل عالم بدلا من إعادة استخدام الخطوات. إنه يعزل هذه الإجراءات في مكان واحد، يجعل هذا الرمز أسهل في العثور عليه. يمكنك استخراج الرمز إلى فئات أو وحدات Ruby المعتادة أيضا.

#/support/world_extensions.rb
module KnowsUser
  def login
    visit('/login')
    fill_in('User name', with: user.name)
    fill_in('Password', with: user.password)
    click_button('Log in')
  end

  def user
    @user ||= User.create!(:name => 'Aslak', :password => 'xyz')
  end
end
World(KnowsUser)

#/step_definitions/authentication_steps.rb
When /^I login$/ do
  login
end

Given /^a logged in user$/ do
  login
end

فيما يلي مناقشة مفيدة حول هذا الموضوع في القائمة البريدية الخيار - حلقة الوصل

أفضل ملف خطواتك في٪ {} بدلا من الاقتباسات. بعد ذلك، لا تحتاج إلى الهروب من اقتباسات مزدوجة والتي ستحتاج إلى استخدامها بشكل متكرر:

Given /^I login successfully$
  step %{I login with valid credentials}
end

Given /^I login with (.*) credentials$/ |type|
  # do stuff with type being one of "invalid" or "valid"
end

إعادة استخدام الكلمات الرئيسية في ملف الميزات التي ستوفر إعادة استخدام التعليمات البرمجية.

لا ينصح بشدة بالاتصال بخطوة Defs في غضون خطوة Defs.

أود أن أكتب ملف مائعي بهذه الطريقة،

Scenario Outline: To check login functionality
    Given I login with "<username>" and "<password>"
    Then I "<may or may not>" login successfully

Examples:
    |username|password|may or may not|
    |paul    |123$    |may           |
    |dave    |1111    |may not       |

في تعريف خطوتي، (هذا هو Java)

@Given(I login with \"([^\"]*)\" and \"([^\"]*)\"$)
public void I_login_with_and(String username, String password){

   //login with username and password

}

@Then(I \"([^\"]*)\" login successfully$)
public void I_login_successully_if(String validity){

    if(validity.equals("may")){
        //assert for valid login
    }
    else
    if(validity.equals("may not")){
        //assert for invalid login
    }
}

بهذه الطريقة، هناك الكثير من تعويضات التعليمات البرمجية. نفس الشيء الذي قدمه ثم يتعامل مع سيناريوهات صالحة وغير صالحة. في الوقت نفسه، فإن ملف الميزات الخاص بك هو المنطقي للقراء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top