هل أكتب مواصفات MSPEC الأولى الخاصة بي بشكل صحيح؟

StackOverflow https://stackoverflow.com/questions/1184297

  •  19-09-2019
  •  | 
  •  

سؤال

أنا أكتب مواصفات MSPEC الأولى وأردت بعض التوجيه. تركت المواصفات في الحالة "المعلقة"، ولكن يتم ملء السياق. هل هناك أي تحسينات يجب إجراؤها؟

للإشارة، هذه هي القصة والسيناريو الأول:

Story: "Blog admin logs in to the system"

As a blog writer
I want to be able to log in to my blog
So that I can write posts and administer my blog

Scenario: "Logs in from the login page"

Given the user enters in correct credentials for a user in the system
When the user clicks the "Login" button
Then log the user in and redirect to the admin panel with a message 
stating that he logged in correctly

ورمز MSPEC (بعض الأجزاء المميزة)، لاحظ أنه اضطررت إلى الاسم المستعار MSPEC It مندوب بسبب الصراع مع Moq.It:

using MoqIt = Moq.It;
using ThenIt = Machine.Specifications.It;

[Subject("User tries logging in")]
public class When_user_enters_valid_credentials : With_user_existing_in_membership
{
    protected static ActionResult result;

    Because of = () =>
    {
        result = loginController.Login(validUsername, validPassword);
    };

    ThenIt should_log_the_user_in;
    ThenIt should_redirect_the_user_to_the_admin_panel;
    ThenIt should_show_message_confirming_successful_login;
}

public abstract class With_user_existing_in_membership
{
    protected static Mock<ISiteMembership> membershipMock;
    protected static string validUsername;
    protected static string validPassword;
    protected static LoginController loginController;

    Establish context =()=>
    {
        membershipMock = new Mock<ISiteMembership>();
        validUsername = "ValidUsername";
        validPassword = "ValidPassword";
        //make sure it's treated as valid usernames and password
        membershipMock
            .Setup<bool>(m => m.Validate(
                MoqIt.Is<string>(s => s == validUsername), 
                MoqIt.Is<string>(s => s == validPassword)))
            .Returns(true);
        loginController = new LoginController(membershipMock.Object);
    };
}
هل كانت مفيدة؟

المحلول

السياق تبدو جيدة. أنا أحب الطريقة التي تحلها المتضاربة It مع الأسماء المستعارة. أود أن أجادل أن اسم مستعار موك يمكن تحسينه. النظر في شيء ما تشبه الجملة. علي سبيل المثال، Param.Is<T> أو Value.Is<T>.

بعض الملاحظات، مع مقتطفات التعليمات البرمجية، ثم إعادة كتابة المواصفات كلها في الأسفل.

السيناريو الخاص بك Subject

يمكن أن يكون الموضوع هو السيناريو من القصة. بالإضافة إلى ذلك، يتم تقديم تقرير تشغيل الاختبار الخاص بك (خاصة بشكل خاص في تقرير HTML).

[Subject("Login Page")]

لا تضيع الوقت على "مع" الطبقات الأساسية المسماة

ميسك الخالق، آرون جينسن، لقد عادت من استخدام بناء جملة "مع" تماما. لا تظهر أسماء فئة السياق لأي تقارير، لذا تجنب قضاء الوقت في اختراع اسم ذي معنى.

public abstract class MembershipContext

المعطى هو اسم فئة المواصفات الخاصة بك

اسم فئة المواصفات الخرسانية بعد الإعداد في قصتك. خاصة منذ عدم الإبلاغ عن اسم الفصل الأساسي في أي مكان، هل يمكن أن تخسر نصف سياقك في التقرير! يجب عليك أيضا تجنب وضع اسم النظام قيد الاختبار في أسماء فئة السياق. هذا يجعل سياقاتك الودية ل Righting System قيد الاختبار.

public class When_an_existing_user_enters_valid_credentials

يجب أن تحتوي فصول المواصفات الأساسية على تهيئة عامة فقط

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

Establish context = () =>
{
    membership = new Mock<ISiteMembership>();
    loginController = new LoginController(membership.Object);
};

يجب أن تكون الحقول في فئة المواصفات الخرسانية خاصة

يقلل من "حفل" اللغة في الاختبار الخاص بك. يجب عليك وضعها أدناه جميع المندوبين المحددين MSPEC، لأن تلك الأجزاء من المواصفات تحكي معظم القصة.

static ActionResult result;

إصلاح المواصفات

المواصفات هنا مثال ممتاز على إنشاء سياق عالمي MembershipContext ورثته في سياق خاص بالمواصفات (وبالتالي الإضافية Establish).

[Subject("Login Page")]
public class When_an_existing_user_enters_valid_credentials : MembershipContext 
{
    Establish context = () =>
    {
        membership
            .Setup<bool>(m => m.Validate(
                Param.Is<string>(s => s == username), 
                Param.Is<string>(s => s == password)))
            .Returns(true);
    };

    Because of = () => result = loginController.Login(username, password);

    It should_log_the_user_in;
    It should_redirect_the_user_to_the_admin_panel;
    It should_show_message_confirming_successful_login;

    static ActionResult result;
    const string username = "username";
    const string password = "password";
}

public abstract class MembershipContext 
{
    Establish context = () =>
    {
        membership = new Mock<ISiteMembership>();
        loginController = new LoginController(membership.Object);
    };

    protected static Mock<ISiteMembership> membership;
    protected static LoginController loginController;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top