解决了SubSonic 3的TestRepository问题

时间:2010-03-16 13:59:30

标签: subsonic subsonic3 subsonic-active-record

我一直在尝试使用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);
        }
    }

在测试存储库中未实现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;
    }

2 个答案:

答案 0 :(得分:2)

谢谢你 - 但最好的办法是告诉我们你的问题:)。 StackOverflow更适合回答问题 - 我可能会建议前往Github并查看最新的来源(我们已经修复了其中的一些)。如果您发现某些事情可以修复 - 非常欢迎补丁。

答案 1 :(得分:0)

对于第2点,如果记录尚未保存,这仍然会被破坏,因为它是在KeyValue()上进行比较。为确保未保存的记录也具有真正的相等性,我们还必须测试记录是否为IsNew,如果是,则确定另一个等式策略