如何在继承类的规范中包含基类的规范?

时间:2011-06-13 15:40:06

标签: c# mspec

我有一个RSSDataSourceParser类,完全由MSpec规范涵盖。我还有一个继承的类MultimediaRSSDataSourceParser。它完成所有父功能以及对iTunes RSS扩展的识别。我在单独的规范中介绍了扩展功能。

但是,阅读测试套件的业务人员只能看到MultimediaRSSDataSourceParser的扩展规范。他们也希望从RSSDataSourceParser看到继承的功能。

复制这些规范听起来很荒谬,可能会导致未来的代码管理问题。有没有办法从父母那里继承规范?

3 个答案:

答案 0 :(得分:7)

MSpec具有非常有用的行为,可以很容易地重复使用。 http://lostechies.com/jamesgregory/2010/01/18/behaviours-in-mspec/

答案 1 :(得分:1)

当你说“它完成所有父[功能]”时,我想象两种类型实现相同的接口,或者至少是继承的。您想使用MSpec的Behaves_like功能。

  

“行为定义了可重用的规范,这些规范封装了一组特定的,你猜对了的行为;然后你就可以在任何具有特定行为的上下文中包含这些规范。” - James Gregory

我不知道RSS数据源阅读器是如何工作的,所以让我向您展示一些我使用行为的示例代码。我需要将来自某个高飞API的2(0,1,2,4等)的整数幂转换为A-Z字符。因此,规范将是

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');

但是,我有三种不同的界面实现。它们包括binary conversionlog conversionlookup table

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

我不打算复制26个规格三次或更多次!所以,我将规范设置为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;
}

那么,编写一个说明这个实现就像一个“单位掩码转换器”的specs类很容易

[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

答案 2 :(得分:0)

情况并非如此,因为 RssDatasourceParser 的测试套件可能包含在大量上下文中。这意味着再多写一些。