作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
{-6ren">
我最近开始使用 MSpec,将类分为 Establish
、Because
和 It
。
虽然我知道如何使用它们,但我不确定是什么让它们起作用。
我知道他们是代表
Because of = () =>
{
};
但是在查看委托(delegate)的定义方式时:
public delegate void Print(int value);
它看起来像 Establish
、Because
和 It
被定义为不返回任何内容的委托(delegate) (void
)并且不接受任何争论。
这是有道理的,但是如何区分 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/
我是一名优秀的程序员,十分优秀!