Subsonic 3 Active Record TestRepository标识列未递增

时间:2009-10-02 10:07:54

标签: unit-testing subsonic

我使用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。

这是设计的吗?如果是这样,如何处理需要按ID选择记录的测试?

3 个答案:

答案 0 :(得分:2)

TestRepository不知道你的DB位是如何设置的(怎么可能?)所以如果你想让它自动增加你需要自己设置它。

答案 1 :(得分:1)

这是对我觉得有用的ActiveRecord模板的更改。基本上它处理一个int或long主键列,在测试模式下auto会分配一个新的id。需要对ActiveRecord.tt模板进行两处更改:

1:在函数top的顶部添加(IDataProvider provider){

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

答案 2 :(得分:0)

(我还没有足够的评论来评论,但这是对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;
            }
<#}#>