我最近开始使用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 = () =>
{
};
}
有人可以为我澄清这个吗?
答案 0 :(得分:4)
这些代表的类型不同,即使它们都具有相同的签名。所以他们根据他们的类型区分。例如,假设您从示例用法中获得此类:
[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();
答案 1 :(得分:0)
是的,他们是代表,as declared here:
他们是所有无参数的无效委托,它们在框架中如何使用方面彼此区分。接受It
的方法不会接受Establish
,例如,这表示方法的意图是什么。不同的代表确实是不同的类型,即使它们具有相同的签名。 (你可以创建一个委托来包装具有兼容签名的不同委托类型的实例,但这种情况相对较少。)
我并不是说我特别喜欢所选择的框架或名称,但是让不同的代表碰巧拥有相同的签名在表达这些代表的不同意图方面非常有意义。