【发布时间】:2010-03-16 13:59:29
【问题描述】:
我一直在尝试使用 SubSonic 3.0 的测试存储库支持进行单元测试,但遇到了一些问题,所以我想我记录了它们,并提出了修复:
自动增量列不起作用
显然没有数据库,自动增量列不会自动工作,但如果像我一样,您对所有标识列使用简单的整数或长整数,此修复效果很好:
(这是来自here 的副本,为了完整性而包含在内)
在 ActiveRecord.tt 中:
1:在函数顶部 public void Add(IDataProvider provider){
public void Add(IDataProvider provider){
<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#>
if (TestMode)
{
this.<#=tbl.PK.CleanName#>=++next_test_autoid;
}
<#}#>
2:在public bool TestMode = false这一行下,添加:
public bool TestMode = false;
<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#>
private static <#=tbl.PK.SysType#> next_test_autoid = 0;
<#}#>
对象相等比较被破坏
使用默认的 ActiveRecord 模板,对象相等不起作用。因此,从数据库中删除项目不起作用,因为 TestRepository 中使用的 List.Remove() 无法匹配被删除的项目。这可以通过以下方式在 tt 模板中修复:(即:将“==”替换为“Equals()”)
在 ActiveRecord.tt 中:
public override bool Equals(object obj){
if(obj.GetType()==typeof(<#=tbl.ClassName#>)){
<#=tbl.ClassName#> compare=(<#=tbl.ClassName#>)obj;
return compare.KeyValue().Equals(this.KeyValue());
}else{
return base.Equals(obj);
}
}
DeleteMany 未在测试存储库中实现
像 records.Delete(x => x.whatever == whatever) 这样的操作在测试存储库中失败,因为 DeleteMany 没有实现。解决这个问题需要获取源代码并自己构建,但这里有一个似乎可行的实现:
在 TestRepository.cs 中:
public int DeleteMany(Expression<Func<T, bool>> expression)
{
foreach (var x in _items.AsQueryable().Where(expression).ToList())
{
_items.Remove(x);
}
return 0;
}
【问题讨论】:
标签: subsonic subsonic3 subsonic-active-record