2009-10-02 57 views
0

我使用Subsonic 3.0.0.3進行單元測試。單元測試按預期運行,記錄計數斷言通過。但是,測試框架不會自動增加標識列。Subsonic 3活動記錄TestRepository標識列不增加

例如

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具有名稱屬性如預期設置,但標識兩者的屬性均爲0。

這是設計嗎?如果是的話如何處理需要通過ID選擇記錄的測試?

回答

2

TestRepository不知道如何設置你的DB位(它怎麼可能?),所以如果你想它自動增量,你需要自己設置它。

1

以下是對ActiveRecord模板的更改,我覺得它很有用。基本上它處理一個int或long主鍵列,並在測試模式下自動分配一個新的id。需要兩個更改ActiveRecord.tt模板:

1:在功能公共無效的頂部添加(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:在線路公共BOOL TESTMODE =假,添加:

 public bool TestMode = false; 
<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#> 
     private static <#=tbl.PK.SysType#> next_test_autoid = 0; 
<#}#> 
+0

我沒有想到直接修改T4模板。謝謝。 – Pauly 2010-07-17 02:18:57

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