Что вызывает и различает «это», «потому что» и «установить» - PullRequest
0 голосов
/ 17 мая 2018

Я недавно начал использовать MSpec, разбивая классы на Establish, Because и It.

Хотя я знаю, как их использовать, я не уверен, что входит взаставить их работать.

Я знаю, что они являются делегатами

Because of = () =>
{

};

Но, глядя на то, как определяются делегаты:

public delegate void Print(int value);

Похоже на Establish, Because и It определены как делегаты, которые ничего не возвращают (void) и не принимают аргументов.

Это имеет смысл, но как различаются Establish, Because и, Itдруг от друга.Т.е. то, что перестает использовать It вместо Establish, работает точно так же.И как один из них знает, как использовать другой?то есть It использует Establish

Также их просто помещают в класс.Что их вызывает?

public class foobar: setup
{
    private static int engineId;

    Because of = () =>
    {

    };

    It should = () =>
    {

    };
}

См. Выше, делегаты инициализированы для этих функций.Но я не знаю, как их называют и почему это не так:

public class foobar: setup
{
    private static int engineId;

    It of = () =>
    {

    };

    It should = () =>
    {

    };
}

Кто-нибудь может уточнить это для меня, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Эти делегаты бывают разных типов, хотя все они имеют одинаковую подпись.Таким образом, они различаются в зависимости от их типа.Например, предположим, что у вас есть этот класс из примера использования:

[Subject("Authentication")]
public class When_authenticating_a_user
{
    Establish context = () =>
    {
        Subject = new SecurityService();
    };

    Cleanup after = () =>
    {
        Subject.Dispose();
    };

    static SecurityService Subject;
}

И теперь вы хотите имитировать выполнение этого теста.Вы используете отражение, чтобы сначала получить все поля, потому что оба поля context и after являются полями:

var fields = typeof(When_authenticating_a_user).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

Теперь у вас есть куча полей, но какие именно?Вы можете различить их по типу поля.Один имеет тип Establish, а другой - Cleanup (оба являются типами делегатов с одинаковой подписью):

var establish = fields.FirstOrDefault(c => c.FieldType == typeof(Establish));
var cleanup = fields.FirstOrDefault(c => c.FieldType == typeof(Cleanup));    

И затем вы создаете экземпляр и выполняете его в соответствии с некоторой логикой:

var instance = Activator.CreateInstance(typeof(When_authenticating_a_user));
// get method
var establishMethod = (Establish)establish.GetValue(instance);
// execute
establishMethod();
0 голосов
/ 17 мая 2018

Да, это делегаты, как заявлено здесь :

Все они - пустые делегаты без параметров, которые отличаются друг от друга с точки зрения того, как они использовал в рамках.Например, метод, который принимает It, не будет принимать Establish, что указывает на намерение метода.Разные делегаты действительно являются разными типами, даже если они имеют одинаковую подпись.(Вы можете создать один делегат для переноса экземпляра другого типа делегата с совместимой подписью, но это относительно редко.)

Я не говорю, что мне особенно нравятся фреймворк иливыбранные имена, но имеющие разных делегатов, у которых одна и та же подпись, имеет смысл с точки зрения выражения различных предполагаемых значений для этих делегатов.

...