【问题标题】:Fixes for problems with SubSonic 3's TestRepository修复了 SubSonic 3 的 TestRepository 问题
【发布时间】: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 =&gt; 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


    【解决方案1】:

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

    【讨论】:

    • 谢谢罗伯。实际上,我在发布之前检查了最新的 github 版本,并且看不到任何这些问题的修复。此外,自动增量的事情,我认为您实际上并不希望在标准模板中使用它(因为我不确定它是否适用于所有情况)。其他问题我将提交今天的补丁。
    【解决方案2】:

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

    【讨论】:

    • 说的太对了,就像一个被咬过的人! Remove() 不适用于未保存的记录,因为它们没有可比较相等的 id。如果 id==0/IsNew() 可能应该回退到引用相等。
    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多