这些句子处理函数中的大多数都从句子本身获取参数,由正则表达式中的捕获组解析.
例如:“我为2个cookie支付了20美元”与我的解析树(字典)中的一个正则表达式相匹配.正则表达式将提取20美元作为组“价格”,将2作为组“金额”匹配.目前我正在映射到正确的Handler函数并调用它如下:
foreach(keyvaluePair<Regex,Type> pair in sentenceTypes) { Match match = pair.Key.Match(text); if(match.Success) { IHandler handler = handlerFactory.CreateHandler(pair.Value); output = handler.Handle(match); } }
简单处理程序类的示例.
public class NoteCookiePriceHandler { public string Handle(Match match) { double payment = Convert.Todouble(match.Result("${payment}")); int amount = Convert.ToInt32(match.Result("${amount}")); double price = payment / amount; return "The price is $" + price; } }
我试图用Moq设置一些单元测试来帮助,当我意识到我实际上不能模拟Match对象,也不是正则表达式.考虑到这一点,设计似乎有些缺陷,因为我依赖于命名组被正确解析并传递给Handler类而没有良好的接口.
我正在寻找有关更有效的设计的建议,用于正确地将参数传递给映射的处理函数/类,因为传递Match对象似乎有问题.
如果做不到这一点,任何帮助找出有效模拟正则表达式或匹配的方法都会受到赞赏,至少可以帮助我解决我的短期问题.它们都缺少默认构造函数,因此我很难让Moq创建它们的对象.
编辑:我最后通过为我的匹配组传递字符串字典而不是(不可Moq-able)匹配对象本身来解决至少模拟问题.我对这个解决方案并不是特别满意,所以建议仍然会受到赞赏.
foreach(keyvaluePair<Regex,Type> pair in sentenceTypes) { match = pair.Key.Match(text); if(match.Success) { IHandler handler= handlerFactory.CreateHandler(pair.Value); foreach (string groupName in pair.Key.GetGroupNames()) { matchGroups.Add(groupName,match.Groups[groupName].Value); } interpretation = handler.Handle(matchGroups);
解决方法
您希望理想的处理程序看起来像什么?这个怎么样:
interface IHandler { String handle(); }
执行:
public class NoteCookiePriceHandler : IHandler { private double payment; private int amount; public NoteCookiePriceHandler(double payment,int amount) { this.payment = payment; this.amount = amount; } public String handle() { return "The price is $" + payment / amount; } }
现在从这个理想的设计开始,也许是对这个设计的测试.如何才能将句子的句子输入发送给处理程序?那么,计算机科学中的所有问题都可以通过另一层间接解决.假设句子解析器不直接创建处理程序,而是使用工厂创建一个:
interface HandlerFactory<T> where T: IHandler { T getHandler(keyvaluePair<String,String> captureGroups); }
然后,您可以为每个处理程序创建一个工厂,但很快您就会找到创建通用工厂的方法.例如,使用反射可以将捕获组名称与构造函数参数进行匹配.根据构造函数参数的数据类型,您可以自动让通用处理程序工厂将字符串转换为正确的数据类型.通过创建一些假处理程序并要求工厂使用一些键值对字符串输入填充它们,这一切都可以轻松测试.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。