1

Spec フレームワークのようなもの (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: return ステートメントが指定されていない場合、デフォルトで "return null" が使用されることを C# で指定する方法はまったくないと思いますか?

グローバル型エイリアス ( のようなものtypedef When as System.Void) がないため、Given クラスと When クラスを実際に導入し、ユーザーにこのメソッドで何かを返すように強制する必要があります。

When メソッドで return ステートメントを使用して、When.ENABLEDまたはWhen.DISABLED("reason")仕様を一時的に無効にします。

「指定されたメソッド」では、テスト対象を返したいと考えています。以下を有効にしたいと考えています。

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

ただし、「式の型を変換できません...戻り値の型に...」

次に、Given への任意のオブジェクトの暗黙的な変換演算子について考えましたが、これは C# でも許可されていません。参照: cs0553 基本クラスからのユーザー定義の変換は許可されていません

Q2: では、これが機能するための回避策はありますか?それとも、戻り値の型を区別するアイデアは運命づけられていますか?

4

1 に答える 1

1

少しデザインを変えれば選択肢は広がります。

  1. an_account がreturn Given(sut)
  2. an_account からプレーン オブジェクトを返し、メソッドを[Given]属性でマークすることができます
  3. また、このクラス内メソッド アプローチを取り除き、linq などの流暢なインターフェイスを備えたビルダー パターンを使用して、テスト定義を作成することもできます。

このような:

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