3

RSSDataSourceParserMSpec 仕様で完全にカバーされているクラスがあります。継承されたクラスもありMultimediaRSSDataSourceParserます。親機能のすべてに加えて、iTunes RSS 拡張機能の認識を行います。拡張機能については、別の仕様で説明しました。

ただし、テスト スイートを読むビジネス関係者は、 の拡張仕様しか表示しませんMultimediaRSSDataSourceParser。から継承された機能も見たいと考えていRSSDataSourceParserます。

これらの仕様をコピーするのはばかげているように聞こえ、将来のコード管理の問題を引き起こす可能性があります。親から仕様を継承する方法はありますか?

4

3 に答える 3

8

MSpec には、このような再利用を非常に簡単にする非常に便利な動作があります。http://lostechies.com/jamesgregory/2010/01/18/behaviours-in-mspec/

于 2011-06-13T15:57:28.747 に答える
1

「すべての親[機能]を実行する」と言うと、2つのタイプが同じインターフェースを実装するか、少なくとも継承されていると思います。Behaves_likeMSpecの機能を使いたい。

「動作は、特定の一連の動作をカプセル化する再利用可能な仕様を定義します。ご想像のとおり、特定の動作を示す任意のコンテキストにこれらの仕様を含めることができます。」--ジェームズ・グレゴリー

RSS データ ソース リーダーの仕組みがわからないので、ビヘイビアを使用したサンプル コードをいくつか示します。間抜けな API から 2 の整数乗 (0、1、2、4 など) を AZ 文字に変換する必要がありました。したがって、仕様は次のようになります

It should_convert_0_to_A = () => _converter.Convert(0).ShouldEqual('A');
It should_convert_1_to_B = () => _converter.Convert(1).ShouldEqual('B');
// ... and so on ...
It should_convert_16777216_to_Z = () => _converter.Convert(16777216).ShouldEqual('Z');

しかし、インターフェースには 3 つの異なる実装がありました。それらには、バイナリ変換ログ変換、およびルックアップ テーブルが含まれていました。

public interface IUnitMaskConverter
{
    char Convert(uint mask);
}

26 仕様を 3 回以上コピーするつもりはありませんでした。それで、仕様をBehaviorsクラスに設定しました

[Behaviors]
public class UnitMaskConverterBehaviors
{
    It should_convert_0_to_A = () => _converter.Convert(0).ShouldEqual('A');
    It should_convert_1_to_B = () => _converter.Convert(1).ShouldEqual('B');
    // ... and so on ...
    It should_convert_16777216_to_Z = () => _converter.Convert(16777216).ShouldEqual('Z');

    protected static IUnitMaskConverter _converter;
}

したがって、この実装が「ユニット マスク コンバーター」のように動作することを示す仕様クラスを作成するのは非常に簡単です。

[Subject(typeof(IUnitMaskConverter))]
public class When_converting_unit_masks_by_lookup
{
    Behaves_like<UnitMaskConverterBehaviors> a_unit_mask_converter;
    protected static LookupUnitMaskConverter _converter = new LookupUnitMaskConverter();
}

[Subject(typeof(IUnitMaskConverter))]
public class When_converting_unit_masks_by_log
{
    Behaves_like<UnitMaskConverterBehaviors> a_unit_mask_converter;
    protected static LogUnitMaskConverter _converter = new LogUnitMaskConverter();
}

[Subject(typeof(IUnitMaskConverter))]
public class When_converting_unit_masks_by_binary
{
    Behaves_like<UnitMaskConverterBehaviors> a_unit_mask_converter;
    protected static BinaryUnitMaskConverter _converter = new BinaryUnitMaskConverter();
}

レポートには、実装ごとにリストされたすべての動作も含まれています。


IUnitMaskConverter の仕様

4 コンテキスト、108 仕様

ユニットマスクをバイナリで変換する場合

26仕様

  • 0 を A に変換する必要があります
  • 1 を B に変換する必要があります
  • ...
  • 16777216 を Z に変換する必要があります

ルックアップでユニットマスクを変換する場合

26仕様

  • 0 を A に変換する必要があります
  • 1 を B に変換する必要があります
  • ...
  • 16777216 を Z に変換する必要があります
于 2011-06-25T04:04:03.850 に答える
0

RssDatasourceParserのtestsuiteが多数のコンテキストから含まれている可能性があるため、これは当てはまりません。これもまたたくさんの書き込みを意味します。

于 2011-06-14T07:25:13.810 に答える