我一直在尝试使用SubSonic 3.0的测试存储库支持进行单元测试,但遇到了一些问题,所以我想我会记录它们,并且我已经提出了修复:
显然没有数据库,自动增量列不会自动运行,但如果像我一样,你对所有标识列使用简单的整数或多头,这个修复效果很好:
(这是here的副本,包括完整性)
在ActiveRecord.tt中:
1:在函数top的顶部添加(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&lt;&gt; .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);
}
}
此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;
}
答案 0 :(得分:2)
谢谢你 - 但最好的办法是告诉我们你的问题:)。 StackOverflow更适合回答问题 - 我可能会建议前往Github并查看最新的来源(我们已经修复了其中的一些)。如果您发现某些事情可以修复 - 非常欢迎补丁。
答案 1 :(得分:0)
对于第2点,如果记录尚未保存,这仍然会被破坏,因为它是在KeyValue()上进行比较。为确保未保存的记录也具有真正的相等性,我们还必须测试记录是否为IsNew,如果是,则确定另一个等式策略