Исправлены проблемы с SubSonic 3 в TestRepository - PullRequest
2 голосов
/ 16 марта 2010

Я пытался использовать поддержку тестового репозитория 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;
    }

Ответы [ 2 ]

2 голосов
/ 16 марта 2010

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

0 голосов
/ 28 февраля 2011

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

...