Исправления проблем с TestRepository от SubSonic 3

Я пытался использовать поддержку тестового репозитория SubSonic 3.0 для модульного тестирования, но столкнулся с несколькими проблемами, поэтому я подумал, что задокументирую их и исправления, которые я придумал:

Столбцы с автоинкрементом не работают

Очевидно, что без БД столбцы с автоматическим приращением не работают автоматически, но если вы, как и я, используете простые целые или длинные числа для всех столбцов идентификаторов, это исправление работает хорошо:

(Это копия из здесь, включены для полноты)

В ActiveRecord.tt:

1: Вверху функции public 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: В строке 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 по умолчанию равенство объектов не работает. Таким образом, удаление элементов из БД не работает, поскольку List ‹>. Remove (), используемый в 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);
        }
    }

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;
    }

person Brad Robinson    schedule 16.03.2010    source источник


Ответы (2)


Спасибо за это, но лучше всего рассказать нам о своих проблемах :). StackOverflow больше подходит для ответов на вопросы - я мог бы предложить перейти на Github и проверить последний источник (мы исправили некоторые из них). Если вы видите, что кое-что можно исправить - очень приветствуются патчи.

person Community    schedule 16.03.2010
comment
Спасибо, Роб. Я действительно проверил последнюю версию github перед публикацией и не нашел исправлений ни для одной из этих проблем. Кроме того, автоматическое приращение, я бы не подумал, что вам действительно нужно это в стандартных шаблонах (поскольку я не уверен, что он работает во всех случаях). По другим вопросам я отправлю патч на сегодня. - person Brad Robinson; 17.03.2010

Что касается пункта 2, это все еще не работает, если запись еще не сохранена, как при сравнении с KeyValue (). Чтобы гарантировать, что несохраненные записи также имеют истинное равенство, мы также должны проверить, является ли запись IsNew, и, если да, определить другую стратегию равенства.

person johnc    schedule 28.02.2011
comment
Слишком уж верно, говоря, как только что укушенный! Remove () не будет работать с несохраненными записями, потому что у них нет идентификатора для сравнения. Вероятно, следует вернуться к ссылочному равенству, если id == 0 / IsNew (). - person david.pfx; 05.01.2012