我最近开始使用 MSpec,将类分为 EstablishBecauseIt

虽然我知道如何使用它们,但我不确定是什么让它们起作用。

我知道他们是代表

Because of = () =>
{

};

但是在查看委托(delegate)的定义方式时:
public delegate void Print(int value);

看起来 EstablishBecauseIt 被定义为不返回任何内容 ( void ) 且不带任何参数的委托(delegate)。

这是有道理的,但是 EstablishBecauseIt 是如何相互区分的。 IE。什么停止使用 It 而不是 Establish 工作是一样的。他们中的一个怎么知道使用另一个?即 It 使用 Establish
他们也只是被放在类里面。什么调用它们?
public class foobar: setup
{
    private static int engineId;

    Because of = () =>
    {

    };

    It should = () =>
    {

    };
}

请参阅上面的已初始化为这些函数的委托(delegate)。但我不知道他们是如何被调用的,以及为什么这不行:
public class foobar: setup
{
    private static int engineId;

    It of = () =>
    {

    };

    It should = () =>
    {

    };
}

任何人都可以为我澄清这一点吗?

最佳答案

这些委托(delegate)是不同类型的,即使它们都具有相同的签名。所以他们是根据他们的类型来区分的。例如,假设您从示例用法中有这个类:

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

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

    static SecurityService Subject;
}

现在您想模拟运行该测试。您首先使用反射获取所有字段,因为 contextafter 都是字段:
var fields = typeof(When_authenticating_a_user).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

现在你有一堆字段,但哪个是哪个?您可以通过字段类型区分它们。一个是 Establish 类型,另一个是 Cleanup 类型(两者都是具有相同签名的委托(delegate)类型):
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();

关于c# - 什么调用和区分 "It"、 "Because"和 "Establish",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50386990/

10-16 19:43