Pergunta

Eu tenho tentado usar o suporte do repositório de teste do Subsonic 3.0 para testes de unidade, mas encontrei alguns problemas, então pensei em documentá -los e as correções que inventei:

Colunas de incrementos automáticos não funcionam

Obviamente, sem DB, as colunas de incrementos automáticos não funcionam automaticamente, mas se, como eu, você está usando INTs simples ou desejam todas as colunas de identidade, essa correção funciona bem:

(Esta é uma cópia de aqui, incluído para completude)

Em ActiveRecord.tt:

1: no topo da função public void add (provedor 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: Sob a linha Public bool testmode = false, add:

        public bool TestMode = false;
<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#>
        private static <#=tbl.PK.SysType#> next_test_autoid = 0;
<#}#>

A comparação de igualdade de objeto está quebrada

Usando o modelo padrão do ActiveRecord, a igualdade do objeto não funciona. Portanto, a remoção de itens do banco de dados não funciona desde que a lista <>. Remover () usada no testRepository não corresponde ao item que está sendo removido. Isso pode ser corrigido nos modelos TT com o seguinte: (ou seja: substituindo "==" com "Equals ()")

Em 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 não é implementado no repositório de teste

Operações como esta records.Delete(x => x.whatever == whatever) falhar contra o repositório de testes porque o DeleTemany não é implementado. Corrigir isso requer obter a fonte e construir a si mesmo, mas aqui está uma implementação que parece funcionar:

Em testrepository.cs:

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

Solução

Obrigado por isso - mas a melhor coisa a fazer é nos contar sobre seus problemas :). O StackOverflow é mais para responder perguntas - posso sugerir ir ao Github e verificar a fonte mais recente (corrigimos vários deles). Se você perceber que algumas coisas podem ser corrigidas - os patches são muito bem -vindos.

Outras dicas

Quanto ao ponto 2, isso ainda está quebrado se o registro ainda não for salvo, pois está comparando no KeyValue (). Para garantir que os registros não economizados também tenham verdadeira igualdade, também devemos testar se o registro é o NEW e, em caso afirmativo, determinar outra estratégia de igualdade

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top