1

我们正在开发类似 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() 和 changed_owner() 没有返回语句。

Q1:我想C#中绝对没有办法指定如果没有给出return语句则默认使用“return null”?

由于没有全局类型别名(类似于typedef When as System.Void),我们被迫实际引入 Given 和 When 类,并强制我们的用户在此方法中返回某些内容。

我们在 When 方法中使用 return 语句When.ENABLEDWhen.DISABLED("reason")临时禁用规范。

在“给定方法”中,我们要返回被测对象。我们要启用以下功能:

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

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

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

Q2:那么有什么解决方法可以解决这个问题,还是返回类型区分的想法注定要失败?

4

1 回答 1

1

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

  1. 您可以将属性添加到 Given 类型,该类型将包含对任何对象的引用,以便 an_account 将return Given(sut)
  2. 您可以从 an_account 返回普通对象并使用[Given]属性标记方法
  3. 您也可以摆脱这种类中方法的方法,而只需使用具有流畅接口的构建器模式(如 linq)来创建测试定义。

像这样:

new Test()
    .Given(() =>new Account())
    .When(()=> ...);
于 2013-07-03T23:25:28.057 回答