我有一个RSSDataSourceParser
类,完全由MSpec规范涵盖。我还有一个继承的类MultimediaRSSDataSourceParser
。它完成所有父功能以及对iTunes RSS扩展的识别。我在单独的规范中介绍了扩展功能。
但是,阅读测试套件的业务人员只能看到MultimediaRSSDataSourceParser
的扩展规范。他们也希望从RSSDataSourceParser
看到继承的功能。
复制这些规范听起来很荒谬,可能会导致未来的代码管理问题。有没有办法从父母那里继承规范?
答案 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 conversion,log conversion和lookup 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();
}
报告甚至列出了每个实施中列出的所有行为。
4个上下文,108个规范
26规范
26规范
答案 2 :(得分:0)
情况并非如此,因为 RssDatasourceParser 的测试套件可能包含在大量上下文中。这意味着再多写一些。