通过返回类型在运行时区分方法

时间:2013-07-03 23:09:51

标签: c# type-conversion

我们正在开发类似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.ENABLEDWhen.DISABLED("reason")的When方法中使用return语句暂时禁用规范。

在“给定的方法”中,我们想要返回被测试的主题。我们想要启用以下内容:

Given an_account() { sut = new Account(); return sut; }

但是:“无法转换表达式类型...返回类型......”

接下来我们考虑了对于任何对象的隐式转换运算符,但是在C#中也不允许这样做,请参阅:cs0553 user-defined conversion from base class not allowed

问题2:那么,是否有任何解决方法可以实现这一点,还是注定回归类型的想法注定要失败?

1 个答案:

答案 0 :(得分:1)

如果你稍微改变你的设计,有很多选择。

  1. 您可以为Given类型添加一个属性,该类型将引用任何对象,以便an_account将return Given(sut)
  2. 您可以从an_account返回普通对象,并使用[Given]属性
  3. 标记该方法
  4. 你也可以摆脱这种方法中的方法,只需使用流畅的界面(如linq)构建模式来创建测试定义。
  5. 像这样:

    new Test()
        .Given(() =>new Account())
        .When(()=> ...);