Subsonic 3 Active Record Идентификационный столбец TestRepository не увеличен - PullRequest
0 голосов
/ 02 октября 2009

Я юнит-тестирование с помощью Subsonic 3.0.0.3. Модульные тесты прошли, как и ожидалось, с подтверждением количества записей. Однако среда тестирования не автоматически увеличивает идентификаторы столбцов.

Например

var p1 = new Person() { Name = "Jack" };
p1.Add();
var p2 = new Person() { Name = "Jill" };
p2..Add();
var t1 = Person.SingleOrDefault(p => p.Name == "Jack");
var t2 = Person.SingleOrDefault(p => p.Name == "Jill");

Структура таблицы, считываемая шаблоном T4

CREATE TABLE Person
(
    Id int IDENTITY(1,1) PRIMARY KEY
    ,Name NVARCHAR(255) NOT NULL 
)

Строка подключения

<add name="SomeDb" connectionString="Test"/>

t1 и t2 имеют свойство name, установленное как положено, но свойство Id равно 0 для обоих.

Это задумано? Если да, то как справиться с тестами, требующими выбора записей по идентификатору?

Ответы [ 3 ]

2 голосов
/ 02 октября 2009

TestRepository не знает, как устанавливаются ваши биты БД (как это может быть?), Поэтому, если вы хотите, чтобы он автоматически увеличивался, вам нужно установить его самостоятельно.

1 голос
/ 16 марта 2010

Вот изменение шаблона ActiveRecord, которое я считаю полезным. В основном он обрабатывает столбец с первичным ключом типа int или long и в тестовом режиме автоматически выделяет новый идентификатор. Требуется два изменения в шаблоне 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;
<#}#>
0 голосов
/ 03 июля 2010

(У меня пока недостаточно комментариев, но это ответ на ответ cantabilesoftware.)

У меня есть отношение подтипа в моей базе данных, где две таблицы 1-> 1. Мне пришлось немного изменить ваш шаблон, чтобы пропустить логику, если ключевому полю уже присвоено значение:

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