我们正在开发类似Spec-framework(例如MSpec,NSpec等)的东西,并希望在运行时区分规范类中的方法:
public class AccountSpecs
{
private Account sut; // subject under test
Given an_account() { sut = new Account(); }
When changing_owner()
{
var result = sut.ChangeOwner("new owner");
It["returns_previous_owner"] = () => result.ShouldBe("old owner");
}
}
正如您所看到的,这个类是不可编译的,因为an_account()和changing_owner()没有return语句。
Q1:我想在C#中绝对没有办法指定如果没有给出return语句,默认情况下会使用“return null”吗?
由于没有全局类型别名(类似typedef When as System.Void
),我们不得不实际引入类Given和When并强制我们的用户返回此方法中的内容。
我们在When.ENABLED
或When.DISABLED("reason")
的When方法中使用return语句暂时禁用规范。
在“给定的方法”中,我们想要返回被测试的主题。我们想要启用以下内容:
Given an_account() { sut = new Account(); return sut; }
但是:“无法转换表达式类型...返回类型......”
接下来我们考虑了对于任何对象的隐式转换运算符,但是在C#中也不允许这样做,请参阅:cs0553 user-defined conversion from base class not allowed
问题2:那么,是否有任何解决方法可以实现这一点,还是注定回归类型的想法注定要失败?
答案 0 :(得分:1)
如果你稍微改变你的设计,有很多选择。
return Given(sut)
[Given]
属性像这样:
new Test()
.Given(() =>new Account())
.When(()=> ...);