我使用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选择记录的测试?
答案 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;
}
<#}#>