我一直在尝试使用亚音速3.0的测试存储库支持单元测试,但遇到了一些问题,所以我认为我记录了它们,以及我想出的修复程序:

自动收入列不起作用

显然,没有数据库,自动插件无法自动工作,但是如果像我一样,您使用简单的INT或longs来适用于所有身份列,则此修复程序效果很好:

(这是来自 这里, ,包括完整性)

在Activerecord.tt中:

1:在功能的顶部公共void add(idataprovider提供商){

        public void Add(IDataProvider provider){

<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#>
            if (TestMode)
            {
                this.<#=tbl.PK.CleanName#>=++next_test_autoid;
            }

<#}#>

2:在行公共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模板,对象平等行不通。因此,从DB中删除项目不起作用,因为TestRepository中使用的列表<>。删除()无法匹配要删除的项目。可以在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) 由于未实施删除,因为未能实施测试存储库。解决此问题需要获取来源并建立自己,但以下是一个似乎有效的实现:

在testrepository.cs中:

    public int DeleteMany(Expression<Func<T, bool>> expression)
    {
        foreach (var x in _items.AsQueryable().Where(expression).ToList())
        {
            _items.Remove(x);
        }
        return 0;
    }
有帮助吗?

解决方案

谢谢您 - 但最好的办法是告诉我们您的问题:)。 Stackoverflow更多地用于回答问题 - 我可能建议前往Github并检查最新的来源(我们已经修复了其中的许多)。如果您发现某些事情可以解决 - 非常欢迎补丁。

其他提示

至于第2点,如果尚未保存记录,则仍然违反,因为它正在比较KeyValue()。为了确保非保存记录也具有真正的平等性,我们还必须测试记录是否new,如果是的,请确定其他平等策略

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top