「すべての親[機能]を実行する」と言うと、2つのタイプが同じインターフェースを実装するか、少なくとも継承されていると思います。Behaves_like
MSpecの機能を使いたい。
「動作は、特定の一連の動作をカプセル化する再利用可能な仕様を定義します。ご想像のとおり、特定の動作を示す任意のコンテキストにこれらの仕様を含めることができます。」--ジェームズ・グレゴリー
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 に変換する必要があります