我有这个方法签名:List<ITMData> Parse(string[] lines)
ITMData
拥有 35 个属性。
您将如何有效地测试这样的解析器?
问题:
- 我应该加载整个文件(我可以使用 System.IO)吗?
- 我应该将文件中的一行放入字符串常量中吗?
- 我应该测试一条或多条线
- 我应该测试 ITMData 的每个属性还是应该测试整个对象?
- 我的测试命名如何?
编辑
我将方法签名更改为 ITMData Parse(string line)
.
测试代码:
[Subject(typeof(ITMFileParser))]
public class When_parsing_from_index_59_to_79
{
private const string Line = ".........";
private static ITMFileParser _parser;
private static ITMData _data;
private Establish context = () => { _parser = new ITMFileParser(); };
private Because of = () => { _data = _parser.Parse(Line); };
private It should_get_fldName = () => _data.FldName.ShouldBeEqualIgnoringCase("HUMMELDUMM");
}
编辑 2
我仍然不确定是否应该只测试每个类的一个属性。在我看来,这让我可以为规范提供更多信息,即当我解析从索引 59 到索引 79 的单行时,我得到了 fldName。如果我测试一个类中的所有属性,我会丢失此信息。我是否过度指定了我的测试?
我的测试现在看起来像这样:
[Subject(typeof(ITMFileParser))]
public class When_parsing_single_line_from_ITM_file
{
const string Line = ""
static ITMFileParser _parser;
static ITMData _data;
Establish context = () => { _parser = new ITMFileParser(); };
private Because of = () => { _data = _parser.Parse(Line); };
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
It should_get_fld??? = () => _data.Fld???.ShouldEqual(???);
...
}