我最近开始使用 MSpec,将类分为 Establish
、 Because
和 It
。
虽然我知道如何使用它们,但我不确定是什么让它们起作用。
我知道他们是代表
Because of = () =>
{
};
但是在查看委托(delegate)的定义方式时:
public delegate void Print(int value);
看起来
Establish
、 Because
和 It
被定义为不返回任何内容 ( void
) 且不带任何参数的委托(delegate)。这是有道理的,但是
Establish
、 Because
和 It
是如何相互区分的。 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;
}
现在您想模拟运行该测试。您首先使用反射获取所有字段,因为
context
和 after
都是字段: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/